FFmpeg dash 相关参数翻译

由于个人英文水平、以及在流媒体领域水平有限,有限翻译可能有误,请参照原文食用。


Muxers are configured elements in FFmpeg which allow writing multimedia streams to a particular type of file.

4.7 dash

Dynamic Adaptive Streaming over HTTP (DASH) muxer that creates segments and manifest files according to the MPEG-DASH standard ISO/IEC 23009-1:2014.

For more information see:

ISO DASH Specification: http://standards.iso.org/ittf/PubliclyAvailableStandards/c065274_ISO_IEC_23009-1_2014.zip
WebM DASH Specification: https://sites.google.com/a/webmproject.org/wiki/adaptive-streaming/webm-dash-specification
It creates a MPD manifest file and segment files for each stream.

The segment filename might contain pre-defined identifiers used with SegmentTemplate as defined in section 5.3.9.4.4 of the standard. Available identifiers are "$RepresentationID$", "$Number$", "$Bandwidth$" and "$Time$". In addition to the standard identifiers, an ffmpeg-specific "$ext$" identifier is also supported. When specified ffmpeg will replace $ext$ in the file name with muxing format’s extensions such as mp4, webm etc.,

SegmentTemplate 用到的 segment 文件名可能包含了在5.3.9.4.4节预先定义的标准标识符。可用的标识符为 "$RepresentationID$", "$Number$", "$Bandwidth$" 和 "$Time$"。除标准标识符之外,一个 ffmpeg 规格的 "$ext$" 也是支持的。 当这个值设置之后,ffmpeg 将会把$ext$ 替换为混流中的格式的扩展名,例如 mp4 , webm 等等。

ffmpeg -re -i <input> -map 0 -map 0 -c:a libfdk_aac -c:v libx264 \
-b:v:0 800k -b:v:1 300k -s:v:1 320x170 -profile:v:1 baseline \
-profile:v:0 main -bf 1 -keyint_min 120 -g 120 -sc_threshold 0 \
-b_strategy 0 -ar:a:1 22050 -use_timeline 1 -use_template 1 \
-window_size 5 -adaptation_sets "id=0,streams=v id=1,streams=a" \
-f dash /path/to/out.mpd
  • min_seg_duration microseconds
    This is a deprecated option to set the segment length in microseconds, use seg_duration instead.

这个选项用来设置 segment 长度,精度为毫秒,不建议使用。用 seg_duration 来替代

  • seg_duration duration
    Set the segment length in seconds (fractional value can be set). The value is treated as average segment duration when use_template is enabled and use_timeline is disabled and as minimum segment duration for all the other use cases.

设置 segment 长度,精度为秒(可以设置小数)。当 use_templateenable 状态,且 use_timelinedisable状态时,这个值会被当作 segment 的平均值。其他时候会被当作 segment 长度的最小值。

  • window_size size
    Set the maximum number of segments kept in the manifest.

设置保留在 manifestsegment 最大数量

  • extra_window_size size
    Set the maximum number of segments kept outside of the manifest before removing from disk.

设置从硬盘上删除之前 manifest 之外 segment 最大数量

  • remove_at_exit remove
    Enable (1) or disable (0) removal of all segments when finished.

enable (1) 或者 disable (0) 结束时删除所有 segments

  • use_template template
    Enable (1) or disable (0) use of SegmentTemplate instead of SegmentList.

Enable (1) 或者 disable (0) 使用 SegmentTemplate 替代 SegmentList.

  • use_timeline timeline
    Enable (1) or disable (0) use of SegmentTimeline in SegmentTemplate.

Enable (1) 或者 disable (0) 在 SegmentTemplate 中使用 SegmentTimeline .

  • single_file single_file
    Enable (1) or disable (0) storing all segments in one file, accessed using byte ranges.

Enable (1) 或者 disable (0) 将所有segments存储到一个文件中, accessed using byte ranges.
后半句有疑问

  • single_file_name file_name
    DASH-templated name to be used for baseURL. Implies single_file set to "1". In the template, "$ext$" is replaced with the file name extension specific for the segment format.

用于 baseURLDASH 模板名称。这意味着 single_file 设置为 “1”。在模板中,"$ext$" 将会被替换为 segment 格式指定的文件名扩展。

  1. $ext$ 这个参数用 ffmpeg34.1.3 尝试过,不生效
    -single_file_name "signame.\$Bandwidth\$.\$RepresentationID\$.\$Time\$.\$ext\$" --> signame.128000.1.0.$ext$
  • init_seg_name init_name
    DASH-templated name to used for the initialization segment. Default is "init-stream$RepresentationID$.$ext$". "$ext$" is replaced with the file name extension specific for the segment format.

用于初始segmentDASH模板名称。默认的 "init-stream$RepresentationID$.$ext$"。 "$ext$" 将会被替换为 segment 格式指定的文件名扩展。

  • media_seg_name segment_name
    DASH-templated name to used for the media segments. Default is "chunk-stream$RepresentationID$-$Number%05d$.$ext$". "$ext$" is replaced with the file name extension specific for the segment format.

用于媒体segmentDASH模板名称。默认为 "chunk-stream$RepresentationID$-$Number%05d$.$ext$"。"$ext$" 将会被替换为 segment 格式指定的文件名扩展。

  • utc_timing_url utc_url
    URL of the page that will return the UTC timestamp in ISO format. Example: "https://time.akamai.com/?iso"

能以 ISO 格式返回 UTC 时间戳的网页地址。例如 "https://time.akamai.com/?iso"

  • method method
    Use the given HTTP method to create output files. Generally set to PUT or POST.

用给定的 HTTP method 创建输出文件。通常设置为 PUT 或者 POST

  • http_user_agent user_agent
    Override User-Agent field in HTTP header. Applicable only for HTTP output.

覆盖 HTTP headerUser-Agent字段。只适用于 HTTP 输出。

  • http_persistent http_persistent
    Use persistent HTTP connections. Applicable only for HTTP output.

使用持久HTTP连接。只适用于 HTTP 输出。

  • hls_playlist hls_playlist
    Generate HLS playlist files as well. The master playlist is generated with the filename master.m3u8. One media playlist file is generated for each stream with filenames media_0.m3u8, media_1.m3u8, etc.

同时生成 HLS 播放清单文件。生成的主播放清单文件名为 master.m3u8。每lu

  • streaming streaming
    Enable (1) or disable (0) chunk streaming mode of output. In chunk streaming mode, each frame will be a moof fragment which forms a chunk.

Enable (1) 或者 disable (0) 分块流模式输出。在分块流模式中,每一帧将会以 moof 片段的形式形成一个块。
moof movie segment,是分段形式解析,如同 hls 中的 ts 分片一样。

  • adaptation_sets adaptation_sets
    Assign streams to AdaptationSets. Syntax is "id=x,streams=a,b,c id=y,streams=d,e" with x and y being the IDs of the adaptation sets and a,b,c,d and e are the indices of the mapped streams.To map all video (or audio) streams to an AdaptationSet, "v" (or "a") can be used as stream identifier instead of IDs.When no assignment is defined, this defaults to an AdaptationSet for each stream.

分配 streamsAdaptationSets。语法是 "id=x,streams=a,b,c id=y,streams=d,e", x,yadaptation sets 的 ID,a,b,c,d,e 是映射到各路流的索引。
为了将所有视频(或音频)流映射到一个 AdaptationSetv(或者a)可以被用作流标识符来替代 ID。没有定义分配时,默认会将所有流放到一个 AdaptationSet 中(???)。

  • timeout timeout
    Set timeout for socket I/O operations. Applicable only for HTTP output.

设置 socket I/O 操作超时时间。只适用于 HTTP 输出。

  • index_correction index_correction
    Enable (1) or Disable (0) segment index correction logic. Applicable only when use_template is enabled and use_timeline is disabled.When enabled, the logic monitors the flow of segment indexes. If a streams’s segment index value is not at the expected real time position, then the logic corrects that index value.Typically this logic is needed in live streaming use cases. The network bandwidth fluctuations are common during long run streaming. Each fluctuation can cause the segment indexes fall behind the expected real time position.

enable (1) 或者 disable (0) segment 索引纠正逻辑。只适用于 use_template 开启,且use_timeline关闭时。
当这个参数开启时,这个逻辑会监控segment的索引流动(增量??)。如果一个流的 segment 索引值不在期望的真是时间位置,那么这个逻辑就会纠正索引值。
通常来说直播流情况下需要这个逻辑。在长时间直播时网络带宽通常会有波动。每次波动都有可能造成 segment 索引落后于期望的真是时间位置。

  • format_options options_list
    Set container format (mp4/webm) options using a : separated list of key=value parameters. Values containing : special characters must be escaped.

设置容器格式(mp4/webm)选项用一个 : 来分隔一系列 key=value 参数。Values 中包含的 : 特殊字符必须被转义。(The use of the word "escape" really means to temporarily escape out of parsing the text and into a another mode where the subsequent character is treated differently.)

  • global_sidx global_sidx
    Write global SIDX atom. Applicable only for single file, mp4 output, non-streaming mode.

写全局 SIDX atom。只适用于单文件,mp4输出,非流模式下。

  • dash_segment_type dash_segment_type
    Possible values:

    • auto
      If this flag is set, the dash segment files format will be selected based on the stream codec. This is the default mode.

    如果这个标志被设定,dash segment 文件格式将基于流格式。这个是默认模式。

    • mp4
      If this flag is set, the dash segment files will be in in ISOBMFF format.

    如果这个标志被设定,dash segment 文件将采用 ISOBMFF 格式。

    • webm
      If this flag is set, the dash segment files will be in in WebM format.

    如果这个标志被设定,dash segment 文件将采用 WebM 格式。

  • ignore_io_errors ignore_io_errors
    Ignore IO errors during open and write. Useful for long-duration runs with network output.

忽略 I/O 打开且在写时发生的错误。在长时间的网络输出中有用。

  • lhls lhls
    Enable Low-latency HLS(LHLS). Adds #EXT-X-PREFETCH tag with current segment’s URI. Apple doesn’t have an official spec for LHLS. Meanwhile hls.js player folks are trying to standardize a open LHLS spec. The draft spec is available in https://github.com/video-dev/hlsjs-rfcs/blob/lhls-spec/proposals/0001-lhls.md This option will also try to comply with the above open spec, till Apple’s spec officially supports it. Applicable only when streaming and hls_playlist options are enabled. This is an experimental feature.

开启低延迟 HLS(LHLS)。给 #EXT-X-PREFETCH 标签增加当前的 segmentURI。 Apple 没有官方的 LHLS 规格。然而 hls.js播放器的人们正在尝试推行一个标准化的开放 LHLS 规格。规格草案在https://github.com/video-dev/hlsjs-rfcs/blob/lhls-spec/proposals/0001-lhls.md可以看到。这个选项将会尝试遵循上面的公开规格,直到 Apple 有官方支持的规格。 只适用于 streaminghls_playlist 选项都开启时。这是个实验特性。

  • master_m3u8_publish_rate master_m3u8_publish_rate
    Publish master playlist repeatedly every after specified number of segment intervals.

特定的segment间隔数目后,重复输出主playlist

关于加解密想到的

能比改别人写的BUG更恶心的事情,大概只有调别人写的接口了吧

接口调用的时候,为了保障敏感数据安全,一般都会做加密或者签名。md5,sha1,sha256,hmac,各种签名算法,128,256,512,cbc,cfb,AES下茫茫多的加密方式,跨语言实现中各种实现方式,简直叫人焦头烂额。

帮别人踩坑

之前做数据加解密传输基本都在自己的项目中,不同组件虽然是不同语言实现的,但是实现细节自己比较清楚,没有遇到什么问题。最近第一次碰到加解密的坑是一个只会py的小胖子,他要去接别人的API,对方用php实现了一套签名算法 hash_hmac('sha256')。他用py的hashlib.sha256自己实现了一套hashHmac,哈希结果死活不对,网上搜也基本都是这样实现,我帮小胖找了好久,才发现要使用base64.b64encode(hmac.new(secret, message, digestmod=hashlib.sha256).digest())

自己踩坑

上一次是接华为云市场的时候,对方在文档中只说了要用AES-CBC-128或者AES-CBC-256来进行加解密,但是我这边用php无论如何都解密不了。无奈之下,只好去看官网demo,结果java 的demo 还是一个代码片段,然我这种没环境,没IDE的人,连调试都做不到。实在没办法,只好人脑编译,然后我看到了这几行

KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");

SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");

secureRandom.setSeed(keyBytes);

keyGenerator.init(encryptType, secureRandom);

SecretKey key = keyGenerator.generateKey();

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");

cipher.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(iv));

我的天呦,原来是Key做了一次哈希再拿去运算的。。。

帮别人写代码

是的,就是帮别人写代码。

客户要对接自己的短信通知系统,需要我们把通知内容下发给他们。对接的小哥有点搞不定,一定要我们给他一个demo,c#的,我从来没写过,我们组也没人写过,我们公司也没人写过。

本着原理相同,工具不同的态度,我决定给小哥撸一个demo。不得不说,在陌生的领域里,举步维艰。算法,demo什么的网上找到了很多,但是一直没有可以运行的环境。vs下了一下午都没好,网页工具又非常不给力,调试到怀疑人生。下好vs后,网上的demo一直报错说CFB方式不支持,怀疑人生。晚上和同组小哥讨论的时候发现:只要在vs上创建 .net工程,不要创建.net core工程就不会报错。。。 微软爸爸你真棒! 弄好环境之后,二十分搞定。

一些牢骚

可能是我对其他语言了解不够深入,也有可能有些误解。但是,从易用性这点上来说,PHP真的是世界上最好的语言。我看到有好几个人用多种语言实现了AES的某一个算法来做对比,PHP版本的总是最简洁的。简洁不仅是指代码行数少,更是对使用者和阅读者心智的解放。

可以从使用加密或者签名的意图出发去想一下,我为什么要这么做?我只是想要保障数据安全!不要和我说经过多少轮的变换,能抵抗多么大规模的暴力破解。我只需要知道是用 CFB 还是 CBC 安全,我要用256还是512。只要告诉我AES-128-CBC,我只想用一个函数,一行去解决这个事情。我不想知道你的key是经过md5,还是sha256之类的鬼方式计算的。也不想知道iv是固定的还是放在密文前面还是后面,是都base64还是部分base64。我只想decrypt(method,cipher)

ubuntu 迁移 docker 目录

天下文章一大抄,不管能不能用都crtl+cv,fuck

1.停服务

2.同步

rsync -avXS --progress /var/lib/docker/. /dst

3.改/etc/default/docker 配置

添加 DOCKER_OPTS="-g /dst"

以上仅在 Ubuntu 14.04.5 LTS Docker version 17.06.0-ce, build 02c1d87 测试通过

关于在 Ubuntu 16.04 ,修改/etc/default/docker 文件配置无效的解决方案

需要在 /etc/docker/daemon.json 中加入

{
  "graph": "/path/to/docker"
}

参考 github
docker daemon-configuration-file

黑群5.2 直升 6.1.4

参考了nasyun数码之家 两位的帖子

升级的主要目的是觉得5.2版本的docker太老了,1.6.几。。。而且下载镜像失败后,会提示下载成功,不能忍。

参考中的两个帖子都需要比较麻烦,依靠程序员的直觉,我找到了更简单的方式。


step.1 备份

  • 备份重要数据
  • 拷贝引导盘中的文件到工作机。

setp.2 重新制作引导

  • 这里下载引导文件
  • 用 Win32 Disk Imager 制作一个新的引导(Holy cow,they made a 1.0 Release.)
  • 打开之前备份中的 syslinux.cfg 找到vid,pid,sn 替换到 \grub\grub.cfg,这里稍微注意一下,新的镜像会把U盘格式化为多个分区,grub.cfg就在其中某一个上
  • 替换mac100:11:32开头的任意mac地址

setp.3 更新系统

  • 到群辉官网 下载 Synology Assistant,安装之后打开
  • 让nas和工作机处于同一局域网,插上u盘,开机
  • 等一小会儿,assistant 显示已经找到nas,双击DiskStation我没有找到隔壁网友提到的升级、转移数据,所以就选择了全新安装,然后下一步下一步安装安装等一会儿喝杯茶再等一会儿
  • 系统自动安装完成之后会提示重新输入管理员帐户,重新输入一遍

setp.4 验收

  • 硬盘里的数据,照片什么的都还在
  • 之前的设置和套件都没了
  • 6.1 貌似比 5.2 的可用套件多了一些

直觉:所有硬件参数都是出厂时定制的,假如老的白群辉可以升级,那么只要复制之前黑群辉的硬件参数也可以升级

MySQL unique and Laravel soft delete

A UNIQUE index creates a constraint such that all values in the index must be distinct. An error occurs if you try to add a new row with a key value that matches an existing row. For all engines, a UNIQUE index permits multiple NULL values for columns that can contain NULL.

laravel 的 soft delete trait 使用 deleted_at 来作为约束。由于需要同时使用唯一和软删除两个特性,所以把 deleted_at 也作为 unique 的一个联合键。测试的时候发现,当 deleted_at 为 null 的时候,可以无限插入,unique并没有约束成功。MySQL官网描述如上,解决方案也容易,直接将 deleted_at 设置为 not null 即可