2021-08-28

linux-unzip-error

1. 解压缩错误
2. 解决办法
3. windows与linux系统的文本文件的2大差异

1. 解压缩错误

有时会遇到一些压缩包, 在Linux下解压缩会失败. 同样的压缩文件拿到Windows下就能成功解压缩. 
后来了解到大都是文件名的字符集问题. 包含有特殊字符, 中文等非UTF8的字符. 

$ unzip -o test.zip 
Archive:  test.zip
Subscene
error:  cannot create Test�.srt
        Invalid or incomplete multibyte or wide character
无效或不完整的多字节或宽字符

$ file Test�.srt 
Test�.srt: Unicode text, UTF-8 (with BOM) text, with CRLF line terminators

2. 解决办法

以上文件是在windows环境下建立并压缩的. 在linux环境下, 挂载ntfs的分区上解压缩这个文件就会包如上错误. 
最简单的办法是把他复制到ext4的文件系统下, 就可以正常解压缩了. 
只是解压缩后会看到的文件名会是如下这样: 
  test�.srt (invalid encoding)
文件名后面有 (无效编码) 的说明文字, 要保留异常字符, 则无法修改名字. 
只要手动修改为只有英文及数字的文件名即可. 

3. windows与linux系统的文本文件的2大差异


2021-07-28

ffmpeg-join

1. join
2. concat连接媒体文件
	2.1 具有相同编解码器的文件的串联
		2.1.1 Concat demuxer
		2.1.2 Concat protocol
	2.2 连接不同编解码器的文件
		2.2.1 Concat filter
		2.2.2 使用外部脚本
	2.3 自动生成输入文件
		2.3.1 Linux-bash
		2.3.2 Windows
	2.4 concat选项
3. mux 复用
4. AudioChannel-mix
5 both-play
	5.1 overlay 覆盖选项说明
	5.2. Examples 举例

1. join

3.13 如何 Join 视频文件?
“join”视频文件是很模糊的。下面的列表解释了不同类型的“join”,并指出了这些在 FFmpeg 中是如何解决的。join 视频文件可能意味着: 
  • concat 连接: one after the other 将它们一个接一个地放置:这被称为连接concatenate 它们(简而言之:concat)详见: https://ffmpeg.org/faq.html#How-can-I-concatenate-video-files
  • mux 复用: together in the same file 将它们放在同一个文件中,让用户在不同版本之间进行选择(例如:不同的音频语言):这被称为将 它们multiplex复用在一起(简称:mux),并且通过简单地调用 ffmpeg 与几个 -i 选项。
  • channels 声道 (audio): to put all channels together in a single stream. 将所有通道放在一个流中(例如:两个单声道流到一个立体声流中):有时会调用它来 合并它们,并且可以使用amerge过滤器来完成。
  • mix 混合 (audio): to play one on top of the other. 一个在另一个之上播放:这被称为mix混合 它们,可以通过首先将它们合并成一个流然后使用pan过滤器随意混合通道来完成。
  • both 同时播放 (video): display both together 将两者一起显示,并排显示或一个显示在另一部分的顶部;它可以使用overlay视频过滤器来完成。

2. concat连接媒体文件

如果您的媒体文件具有完全相同的编解码器和编解码器参数,您可以按照“连接具有相同编解码器的文件”中所述将它们连接起来。
如果您有不同编解码器的媒体,您可以按照下面的“连接不同编解码器的文件”中的说明将它们连接起来。

2.1 具有相同编解码器的文件的串联

2.1.1 Concat demuxer

您可以在文档中阅读有关 concat demuxer 的信息。这个解复用器从一个文本文件中读取一系列文件和其他指令,并一个接一个地解复用它们,就好像它们的所有数据包都被混合在一起一样。所有文件必须具有相同的流(相同的编解码器、相同的时基等),但可以包装在不同的容器格式中。
mylist.txt是包含如下内容的文件列表
file '/path/to/file1.wav'
file '/path/to/file2.wav'

ffmpeg -f concat -safe 0 -i mylist.txt -c copy output.wav
-safe 0 如果路径是相对的,则不需要。
$ ffmpeg -f concat -i g1.txt -c copy output.mkv

您还可以循环播放视频。此示例将循环input.mkv10 次:
for i in {1..10}; do printf "file '%s'\n" input.mkv >> mylist.txt; done
ffmpeg -f concat -i mylist.txt -c copy output.mkv

2.1.2 Concat protocol

demuxer在流级别工作,而 concat 协议在文件级别工作。可以连接某些文件(MPEG-2 传输流,可能还有其他文件)。这类似于cat在类 UNIX 系统或Windows 上的copy。
以下命令连接三个 MPEG-2 TS 文件并连接它们而不重新编码:
$ ffmpeg -i "concat:input1.ts|input2.ts|input3.ts" -c copy output.ts

$ ffmpeg -i "concat:g1.mkv|g2.mkv" -c copy output.mkv
注: 看起来不支持mkv, 参照以上写法(原始文件g1.mkv g2.mkv 各10s). 输出总10s, 视频合并为一个流(一个被覆盖所以永远看不到); 音频则合并为一个流(就是同时播放的效果). 

使用中间文件
如果您有 MP4 文件,可以通过首先将它们转码为 MPEG-2 传输流来无损地连接这些文件。对于 H.264 视频和 AAC 音频,可以使用以下内容:
ffmpeg -i input1.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts intermediate1.ts
ffmpeg -i input2.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts intermediate2.ts
ffmpeg -i "concat:intermediate1.ts|intermediate2.ts" -c copy -bsf:a aac_adtstoasc output.mp4

使用命名管道避免中间文件
如果您使用的系统支持命名管道,则可以使用它们来避免创建中间文件。这会将 stderr(ffmpeg 将所有写入的数据发送到它)发送到/dev/null,以避免使命令行混乱:
mkfifo temp1 temp2
ffmpeg -y -i input1.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts temp1 2> /dev/null & \
ffmpeg -y -i input2.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts temp2 2> /dev/null & \
ffmpeg -f mpegts -i "concat:temp1|temp2" -c copy -bsf:a aac_adtstoasc output.mp4
需要 -y 额外的开关来强制 ffmpeg 写入现有文件temp1和temp2,它们是命名管道。如果没有开关,在后台运行的前两个 ffmpeg 程序将不会产生任何输出,因为它们等待交互式是/否回答是否覆盖现有文件的问题。

2.2 连接不同编解码器的文件

在很多情况下,输入文件会有不同的编解码器或不同的编解码器属性,这使得无法使用上述任何一种方法。

2.2.1 Concat filter

有关更多信息,请参阅concat 过滤器文档。该过滤器适用于同步视频和音频流的片段。所有段必须具有相同数量的每种类型的流,这也将是输出的流数。
注意:过滤器与流复制不兼容;你不能用-c copy这种方法。由于您必须重新编码视频和音频流,并且重新编码可能会引入压缩伪影,因此请确保添加正确的目标比特率bitrate 或质量quality设置。有关更多信息,请参阅编码指南。

要使 concat 过滤器工作,输入必须具有相同的帧尺寸(例如,1920x1080 像素)并且应该具有相同的帧速率。因此,你可能至少需要添加一个  scale or scale2ref 拼接视频前过滤器。少数其他属性也必须匹配,例如流纵横比stream aspect ratio。有关更多信息,请参阅过滤器的文档。

假设我们有三个要连接的文件——每个文件都有一个视频和音频流。concat 过滤器命令如下所示:
ffmpeg -i input1.mp4 -i input2.webm -i input3.mov \
-filter_complex "[0:v:0][0:a:0][1:v:0][1:a:0][2:v:0][2:a:0]concat=n=3:v=1:a=1[outv][outa]" \
-map "[outv]" -map "[outa]" output.mkv
现在,让我们剖析该命令。我们首先指定所有输入文件,然后实例化一个-filter_complex过滤器图——这是需要的,而不是-filter:v因为它有多个输入和输出。
[0:v:0][0:a:0][1:v:0][1:a:0][2:v:0][2:a:0]
告诉 ffmpeg 从输入文件中获取哪些流并将其作为输入发送到 concat 过滤器。在这种情况下,视频流 0 [0:v:0] 和音频流 0 [0:a:0] 来自输入 0(input1.mp4在本例中),视频流 0 [1:v:0] 和音频流 0 [ 1:v:0] 来自输入 1 ( input2.webm) 等。
concat=n=3:v=1:a=1[outv][outa]'
这是 concat 过滤器本身。n=3告诉过滤器有三个输入段;v=1告诉它每个片段将有一个视频流;a=1告诉它每段将有一个音频流。然后过滤器连接这些段并产生两个输出流。[outv]和[outa]是这些输出流的名称。请注意,过滤器部分周围的引号是必需的。
然后,您可以在其他过滤器中重新使用这些流,或将它们映射到输出文件:
-map "[outv]" -map "[outa]" output.mkv
这告诉 ffmpeg 使用 concat 过滤器的结果,而不是直接来自输入文件的流。

ffmpeg -i g1.mkv -i g2.mkv -filter_complex "[0:v:0][0:a:0][1:v:0][1:a:0]concat=n=2:v=1:a=1[outv][outa]" -map "[outv]" -map "[outa]" output.mkv

2.2.2 使用外部脚本

有一个名为mmcat的 Bash 脚本对于不包含concat过滤器的旧版本 ffmpeg 很有用。

2.3 自动生成输入文件

2.3.1 Linux-bash

 with a bash for loop
$ for f in *.wav; do echo "file '$f'" >> mylist.txt; done
 or with printf
$ printf "file '%s'\n" *.wav > mylist.txt

即时更改播放列表文件
concat demuxer 仅在需要时打开引用的文件。这使我们能够在 demuxer 后面原子地交换引用的文件,以便能够将 concat demuxer 用作可更改的实时源。查看以下示例文件 list.txt:
ffconcat version 1.0
file dummy.mxf
file dummy.mxf
dummy.mxf 被引用两次,以确保 concat demuxer 在它到达时重新打开文件。将此与无限循环结合起来,您就完成了:
$ ffmpeg -re -stream_loop -1 -i list.txt -flush_packets 0 -f mpegts udp://127.0.0.1:5000?pkt_size=1316
现在您可以通过简单的移动命令更改循环剪辑:
$ mv next_clip.mxf dummy.mxf

自动附加到列表文件
如果当前不存在下一个剪辑,则连接不起作用,因为在读取整个列表之前不会开始解码。但是,可以引用当前列表末尾的另一个列表。以下脚本为此机制提供了一个示例:
https://trac.ffmpeg.org/wiki/Concatenate#demuxer
请注意,递归引用播放列表文件将导致 ffmpeg 最终耗尽文件描述符(或其他资源),因为 ffmpeg 仅在播放列表完成时关闭播放列表文件,但在上面的示例中,由于递归链接实际上没有播放列表文件结尾。

2.3.2 Windows

Command-line:
(for %i in (*.wav) do @echo file '%i') > mylist.txt
Powershell:
foreach ($i in Get-ChildItem .\*.wav) {echo "file '$i'" >> mylist.txt}
bat-file:
(for %%i in (*.wav) do @echo file '%%i') > mylist.txt

2.4 concat选项

3.4.2 Options
20.4.2 Options
此多路分配器接受以下选项:
-safe
如果设置为 1,则拒绝不安全的文件路径。如果文件路径不包含协议规范并且是相对的,并且所有组件仅包含可移植字符集中的字符(字母、数字、句点、下划线和连字符)并且组件开头没有句点,则该文件路径被认为是安全的。
如果设置为 0,则接受任何文件名。
默认值为 1。
-1 等价于 1 如果格式被自动探测,否则为 0。

-auto_convert
如果设置为 1,则尝试对数据包数据执行自动转换以使流可连接。默认值为 1。
目前,唯一的转换是将 h264_mp4toannexb 比特流过滤器添加到 MP4 格式的 H.264 流中。如果分辨率发生变化,这尤其必要。

-segment_time_metadata
如果设置为 1,每个数据包将包含 lavf.concat.start_time 和 lavf.concat.duration 数据包元数据值,它们是连接输出中各个文件段的 start_time 和持续时间,以微秒表示。仅当基于 concat 文件已知时才设置持续时间元数据。默认值为 0。

3. mux 复用

2个视频流, 选择播放, 并不首位相接. 音频只保留了1个.
$ ffmpeg -i g0.mkv -i h0.mkv -map 0:0 -map 1:0 -map 0:1 -c copy ot2.mkv

2个视频流, 2个音频流, 选择播放.
$ ffmpeg -i g0.mkv -i h0.mkv -map 0:0 -map 1:0 -map 0:1 -map 1:1 -c copy ot2.mkv

$ ffmpeg -i g0.mkv -i h0.mkv -i a1.flv  -map 0:0 -map 1:0 -map 2:0 -map 0:1 -c copy ot2.mkv
$ ffmpeg -i g0.mkv -i h0.mkv -i a1.flv -i a2.mp4 -i c0.mkv  -map 0:0 -map 1:0 -map 2:0 -map 3:0 -map 4:0 -map 0:1 -map 4:1 -c copy ot2.mkv
更多视频融合为流, 不编译, 速度也能快. 分辨率不同, 也都会保留各自的分辨率.

4. AudioChannel-mix

2.8 Channel Layout 通道布局
下表摘录自如下页面: 

Picture https://trac.ffmpeg.org/wiki/AudioChannelManipulation
[1.1-4] stereo → mono stream Downmix both channels 下缩两个通道 Use -ac
将单个立体声流混合成单声道流。立体声流的两个通道都将被缩混到流中:
$ ffmpeg -i stereo.flac -ac 1 mono.flac
警告:任何异相立体声都会抵消。 以下滤波器图可用于在缩混之前使立体声同相异相:
-af "asplit[a],aphasemeter=video=0,ametadata=select:key=lavfi.aphasemeter.phase:value=-0.005:function=less,pan=1c|c0=c0,aresample=async=1:first_pts=0,[a]amix"
[1.2] 立体声 → 单声道 Choose a specific channel 选择特定频道 Use channelsplit or pan
此示例使用 channelsplit 音频过滤器仅包含正确的通道:
$ ffmpeg -i stereo.wav -filter_complex "[0:a]channelsplit=channel_layout=stereo:channels=FR[right]" -map "[right]" front_right.wav
$ ffmpeg -i stereo.wav -af "pan=mono|c0=c1" mono.m4a
或者,您可以c0=FR改用。如果想要左声道,请使用c0=c0或c0=FL。
[2-5] stereo → 2 × mono files Use channelsplit or -map_channel or pan
使用 channelsplit 音频过滤器将立体声输入中的每个通道输出到单独的单声道文件:
$ ffmpeg -i stereo.wav -filter_complex "[0:a]channelsplit=channel_layout=stereo[left][right]" -map "[left]" left.wav -map "[right]" right.wav
$ ffmpeg -i stereo.wav -map_channel 0.0.0 left.wav -map_channel 0.0.1 right.wav
$ ffmpeg -i stereo.wav -filter_complex "[0:a]pan=1c|c0=c0[left];[0:a]pan=1c|c0=c1[right]" -map "[left]" left.wav -map "[right]" right.wav
[3] stereo → 2 × mono streams Use channelsplit
使用 channelsplit 音频过滤器将立体声输入中的每个通道输出到一个输出文件中的单个单声道流:
$ ffmpeg -i in.mp3 -filter_complex "[0:a]channelsplit=channel_layout=stereo" output.mka
[4-1.1] mono → stereo Use -ac or amerge
从一个单声道输入创建立体声输出:
$ ffmpeg -i input.mp3 -ac 2 output.m4a
$ ffmpeg -i input.mp3 -filter_complex "[0:a][0:a]amerge=inputs=2[a]" -map "[a]" output.m4a
注意:这些示例不会从单声道输入神奇地创建“真正的”立体声输出,而只是将相同的音频放入输出的左右声道(两个声道将相同)。
[5-2] 2 × mono → stereo Use join or amerge
使用 join 音频过滤器从两个单声道输入创建立体声输出:
$ ffmpeg -i left.mp3 -i right.mp3 -filter_complex "[0:a][1:a]join=inputs=2:channel_layout=stereo[a]" -map "[a]" output.mp3
$ ffmpeg -i left.mp3 -i right.mp3 -filter_complex "[0:a][1:a]amerge=inputs=2[a]" -map "[a]" output.mka
[10] stereo → stereo Mix both stereo channels to stereo 两个立体声通道混合为立体声 pan
输出的左右声道将分别包含输入的左右声道:
$ ffmpeg -i input.mp3 -af "pan=stereo|c0<c0+c1|c1<c0+c1" output.ogg
[11] Switch stereo channels 切换立体声通道 Use channelmap or pan or -map_channel
使用 channelmap 音频过滤器将左声道切换到右声道和右声道切换到左声道:
$ ffmpeg -i stereo.mp3 -filter_complex "channelmap=map=FL-FR|FR-FL:channel_layout=stereo" output.mp3
$ ffmpeg -i stereo.ogg -af pan=stereo|c0=c1|c1=c0 output.wav
$ ffmpeg -i stereo.ogg -map_channel 0.0.1 -map_channel 0.0.0 output.wav
[12] Mute a channel 静音 Use pan or -map_channel
此示例使用 pan 音频过滤器将第一个通道(左前)静音,但保持第二个通道(右前)不变:
$ ffmpeg -i stereo.wav -af "pan=stereo|c1=c1" output.wav
$ ffmpeg -i stereo.wav -map_channel -1 -map_channel 0.0.1 output.wav
Picture https://trac.ffmpeg.org/wiki/AudioChannelManipulation
[8] 5.1 → stereo Use -ac or pan
要缩混,您可以简单地使用-ac 2:
$ ffmpeg -i 6channels.wav -ac 2 stereo.wav
注意: 默认情况下,使用-ac 2LFE 通道时省略。请参见“数字音频压缩标准(文件A / 52:2012) ”,部分6.1.12和7.8的更多信息缩混。
http://atsc.org/wp-content/uploads/2015/03/A52-201212-17.pdf
ffmpeg集成了一个默认的向下混音(和向上混音)系统,-ac除非您有非常特殊的需求,否则该系统应该优先于(选项)而不是 pan 过滤器。
如果您想映射特定频道并删除其余频道,您可以使用 pan 音频过滤器。这会将FL输入的(左前)映射到 FL输出的 ,并将输入的FR(右前)映射到FR输出的 :
$ ffmpeg -i 6channels.wav -af "pan=stereo|c0=FL|c1=FR" stereo.wav
您还可以按编号映射特定频道。此示例将输入的第一个和第三个通道映射到输出的第一个和第二个通道。
$ ffmpeg -i 6channels.wav -af "pan=stereo|c0=c0|c1=c2" output.wav
如果将=通道规范中的 替换为<,则该规范的增益将被重新归一化,使总数为 1,从而避免削波噪声。有关其他信息和示例,请参阅声像音频过滤器文档。
https://ffmpeg.org/ffmpeg-filters.html#pan
[9.1] 2 × stereo → stereo (a.fl + b.fl → c.FL; a.fr + b.fr → c.FR) Use amerge和pan or -ac
使用amerge和pan音频过滤器将两个立体声输入合并为一个立体声输出:
$ ffmpeg -i input1.wav -i input2.wav -filter_complex "[0:a][1:a]amerge=inputs=2,pan=stereo|c0<c0+c2|c1<c1+c3[a]" -map "[a]" output.mp3
$ ffmpeg -i input1.wav -i input2.wav -filter_complex "[0:a][1:a]amerge=inputs=2[a]" -map "[a]" -ac 2 output.mp3
注意:使用 pan 音频过滤器产生的输出可能与使用 产生的输出不同-ac 2,因此您必须聆听输出或查看音频统计信息,以确定哪种输出适合您.
https://trac.ffmpeg.org/wiki/AudioChannelManipulation#Statistics
[9.2] (a.fl + fr → c.FL; b.fl + fr → c.FR) Use amerge和pan
与上面类似的情况,而是使用第一个输入的左右声道使左声道输出,并使用第二个输入的左右声道使输出的右声道。
只需更改平移过滤器中的通道规格:
$ ffmpeg -i input1.wav -i input2.wav -filter_complex "[0:a][1:a]amerge=inputs=2,pan=stereo|c0<c0+c1|c1<c2+c3[a]" -map "[a]" output.mp3
在这种情况下必须使用声像音频过滤器,而不是-ac 2与前面的示例不同。
https://trac.ffmpeg.org/wiki/AudioChannelManipulation

[6-7] 6 × mono → 5.1 Use join or amerge
使用 join 音频过滤器将 6 个单声道输入合并为一个 5.1(6 声道)输出:
$ ffmpeg -i front_left.wav -i front_right.wav -i front_center.wav -i lfe.wav -i back_left.wav -i back_right.wav \
-filter_complex "[0:a][1:a][2:a][3:a][4:a][5:a]join=inputs=6:channel_layout=5.1[a]" -map "[a]" output.wav
加入音频过滤器还允许您手动选择布局:
$ ffmpeg -i front_left.wav -i front_right.wav -i front_center.wav -i lfe.wav -i back_left.wav -i back_right.wav \
-filter_complex "[0:a][1:a][2:a][3:a][4:a][5:a]join=inputs=6:channel_layout=5.1:map=0.0-FL|1.0-FR|2.0-FC|3.0-LFE|4.0-BL|5.0-BR[a]" -map "[a]" output.wav
另一种使用amerge音频过滤器的方法比上面显示的连接过滤器灵活一些:
$ ffmpeg -i front_left.wav -i front_right.wav -i front_center.wav -i lfe.wav -i back_left.wav -i back_right.wav \
-filter_complex "[0:a][1:a][2:a][3:a][4:a][5:a]amerge=inputs=6[a]" -map "[a]" output.wav
使用 amerge,所有输入必须具有相同的采样率和格式。如果输入的持续时间不同,则输出将以最短的时间停止。

[7-6] 5.1 → 6 × mono Use channelsplit
使用 channelsplit 音频过滤器将 5.1 声道输入拆分为单独的每声道文件:
$ ffmpeg -i in.wav \
-filter_complex "channelsplit=channel_layout=5.1[FL][FR][FC][LFE][BL][BR]" \
-map "[FL]" front_left.wav \
-map "[FR]" front_right.wav \
-map "[FC]" front_center.wav \
-map "[LFE]" lfe.wav \
-map "[BL]" back_left.wav \
-map "[BR]" back_right.wav

[13] Remap channels 重新映射  Use channelmap 
channelmap 音频滤波器可以重新安排信道的布局。例如,要在 5.1 输入中切换 FL 和 FR 通道: 
$ ffmpeg -i input.wav -filter_complex "channelmap=map=FL-FR|FR-FL|FC-FC|LFE-LFE|BL-BL|BR-BR:channel_layout=5.1" output.wav

[14] Virtual Binaural Acoustics  虚拟双耳声学 sofalizer 
FFmpeg 可以使用 sofalizer 音频过滤器生成虚拟双耳声学文件。输入支持大多数已知的通道布局,并且输出始终是立体声。 
$ ffmpeg -i input.wav -af sofalizer=/path/to/sofa/file output.flac

[15] Multiple channel layouts 多通道布局 pan  
此示例使用 pan 音频过滤器将两个布局 (5.1+2.0) 组合成一个任意布局: 
$ ffmpeg -i input -filter_complex "pan=5.1+downmix|FL=c0|FR=c1|FC=c2|LFE=c3|BL=c4|BR=c5|DL=c6|DR=c7[a]" -map "[a]" out.wav 
示例中的输出产生了一个具有 8 个通道的音频流。

本节用到的主要选项及过滤器:
  • 分/合 -ac
  • 分/合 -map_channel
  • 分/合 channelmap
  • 分/合 pan
  • 分  channelsplit 
  • 合  join 
  • 合  amerge

5. both-play

both 同时播放 (video): display both together 将两者一起显示,并排显示或一个显示在另一部分的顶部;它可以使用overlay视频过滤器来完成。

5.1 overlay 覆盖选项说明

将一个视频叠加在另一个视频上。
它需要两个输入,一个输出。 第一个输入是覆盖第二个输入的“主”视频。
它接受以下参数:
x, y  设置主视频上叠加视频的 x 和 y 坐标表达式。两个表达式的默认值都是“0”。如果表达式无效,则将其设置为一个巨大的值(意味着不会在输出可见区域内显示叠加层)。
eval  在计算 x 和 y 的表达式时设置。它接受以下值:
‘init’    仅在过滤器初始化期间或处理命令时对表达式求值一次
‘frame’   评估每个传入帧的表达式. Default value is ‘frame’.
format    设置输出视频的格式。它接受以下值:
‘yuv420’     force YUV420 output
‘yuv420p10’  force YUV420p10 output
‘yuv422’     force YUV422 output
‘yuv422p10’  force YUV422p10 output
‘yuv444’    force YUV444 output
‘rgb’       force packed RGB output
‘gbrp’      force planar RGB output
‘auto’      automatically pick format
Default value is ‘yuv420’.
eof_action  See framesync. 
shortest    See framesync. 请参阅帧同步。
repeatlast  See framesync. https://ffmpeg.org/ffmpeg-filters.html#framesync
alpha  设置叠加视频的 alpha 格式,可以是直接或预乘。默认是 straight。

x 和 y 表达式可以包含以下参数。
main_w, W
main_h, H
The main input width and height. 主要输入宽度和高度。

overlay_w, w
overlay_h, h
The overlay input width and height. 叠加输入宽度和高度。

x, y    x 和 y 的计算值。它们针对每个新帧进行评估。

hsub
vsub
输出格式的水平和垂直色度子样本值。 例如,对于像素格式“yuv422p”,hsub 为 2,vsub 为 1。

n    输入帧数,从0开始
pos    输入帧在文件中的位置,如果未知,则为 NAN
t    时间戳,以秒表示。 如果输入时间戳未知,则为 NAN。

此过滤器还支持帧同步选项。
请注意,n、pos、t 变量仅在每帧完成评估时可用,并且当 eval 设置为“init”时将评估为 NAN。
请注意,帧是按时间戳顺序从每个输入视频中获取的,因此,如果它们的初始时间戳不同,最好通过 setpts=PTS-STARTPTS 过滤器传递两个输入,让它们以相同的零时间戳开始, 就像电影过滤器的例子一样。
您可以将更多的叠加层链接在一起,但您应该测试这种方法的效率。

11.161.1 Commands
此过滤器支持以下命令:
x
y
修改覆盖输入的 x 和 y。 该命令接受相应选项的相同语法。
如果指定的表达式无效,则保持其当前值。

5.2 Examples 举例

在距主视频右下角 10 像素处绘制叠加层:
  overlay=main_w-overlay_w-10:main_h-overlay_h-10
使用命名选项,上面的例子变成:
  overlay=x=main_w-overlay_w-10:y=main_h-overlay_h-10

使用带有 -filter_complex 选项的 ffmpeg 工具在输入的左下角插入一个透明的 PNG 徽标:
 $ ffmpeg -i input -i logo -filter_complex 'overlay=10:main_h-overlay_h-10' output
使用 ffmpeg 工具插入 2 个不同的透明 PNG 标志(右下角的第二个标志):
 $ ffmpeg -i input -i logo1 -i logo2 -filter_complex 'overlay=x=10:y=H-h-10,overlay=x=W-w-10:y=H-h-10' output

在主视频的顶部添加一个透明的颜色层; WxH 必须指定覆盖过滤器的主要输入的大小:
  color=color=red@.3:size=WxH [over]; [in][over] overlay [out]

使用 ffplay 工具并排播放原始视频和过滤版本(此处使用 deshake 过滤器):
 $ ffplay input.avi -vf 'split[a][b]; [a]pad=iw*2:ih[src]; [b]deshake[filt]; [src][filt]overlay=w'
上面的命令等同于:
 $ ffplay input.avi -vf 'split[b], pad=iw*2[src], [b]deshake, [src]overlay=w'

从时间 2 开始,从屏幕的左上方到右上方出现一个滑动覆盖:
  overlay=x='if(gte(t,2), -w+(t-2)*20, NAN)':y=0

通过将两个输入视频并排放置来组合输出:
 $ ffmpeg -i left.avi -i right.avi -filter_complex "
nullsrc=size=200x100 [background];
[0:v] setpts=PTS-STARTPTS, scale=100x100 [left];
[1:v] setpts=PTS-STARTPTS, scale=100x100 [right];
[background][left]       overlay=shortest=1       [background+left];
[background+left][right] overlay=shortest=1:x=100 [left+right]
"

通过将 delogo 过滤器应用于某个部分来屏蔽视频的 10-20 秒
 $ ffmpeg -i test.avi -codec:v:0 wmv2 -ar 11025 -b:v 9000k
-vf '[in]split[split_main][split_delogo];[split_delogo]trim=start=360:end=371,delogo=0:0:640:480[delogoed];[split_main][delogoed]overlay=eof_action=pass[out]'
masked.avi

级联多个叠加层:
nullsrc=s=200x200 [bg];
testsrc=s=100x100, split=4 [in0][in1][in2][in3];
[in0] lutrgb=r=0, [bg]   overlay=0:0     [mid0];
[in1] lutrgb=g=0, [mid0] overlay=100:0   [mid1];
[in2] lutrgb=b=0, [mid1] overlay=0:100   [mid2];
[in3] null,       [mid2] overlay=100:100 [out0]

2021-07-11

Subtitle-ass-srt

1. ass
	1.1 ssa-ass
	1.2 脚本说明
		1.2.1 头部
		1.2.2 样式定义
		1.2.3 主体
		1.2.4 注意事项
	1.3 双语字幕
2. srt
	2.1 文件格式
	2.2 样式
	2.3 位置
3. 小结
	3.1 列出支持的格式
	3.2 srt-ass
	3.3. sbv-srt
4 字幕操作
	4.1 软字幕(推荐)
		4.1.1 提取字幕流
		4.1.2 添加字幕流
		4.1.3 注意
	4.2. 硬字幕(不推荐)
5. 相关链接

1. ass

1.1 ssa-ass

  • SubStation Alpha(或 Sub Station Alpha),简称SSA,是由 CS Low(亦作 Kotus)创建、比传统字幕(如SRT)更加强大先进的字幕文件格式。该格式在Windows平台上可以经播放器由VSFilter渲染进行播放。这是一款广受欢迎且已停止开发的字幕编辑制作工具。
  • 而Advanced SubStation Alpha(ASS)是一种比SSA更先进的字幕脚本格式。基于SSA 4.00+编码构建。ASS的主要变化就是在SSA编写风格的基础上增添更多的效果和指令。SSA当前版本为V4.00。ASS则使用更高级的V4.00+编码。

1.2 脚本说明

1.2.1 头部

Script Info: 脚本的一般全局信息:
Title:标题
Original Script:作者
Script Updated By:更新时间
Script Type:类型(用于兼容性设置,SSA为4.00,ASS为4.00+)
PlayResX & PlayResY:屏幕宽高
PlayDepth(决定颜色数量)
Timer:定时器

1.2.2 样式定义

V4 Styles: 定义文字样式,在events部分可以直接调用这些样式。
[V4+ Styles]
Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding
[V4+ 样式]
格式:名称、字体名称、字体大小、原色、副色、轮廓色、底色、粗体、斜体、下划线、删除线、
缩放X、缩放Y、间距、角度、边框样式、外线、阴影、对齐、边距L、边距R、边距V、编码
PrimaryColour. 第一颜色,即文字本身的颜色
SecondaryColour. 第二颜色。在卡拉OK时使用,卡拉OK指令会用第一颜色填充第二颜色。
TertiaryColour(ASS中称为OutlineColour)边框色,文字边框的颜色。
BackColour. 阴影颜色,文字阴影的颜色。
MarginL, MarginR. 左右缩进。文字距离视频最左最右的最小距离。
MarginV. 上下缩进。文字热点(对齐点)距离视频上下的最小间距离。这取决于文字对齐方式,如果该文字使用中对齐,则上下缩进值无效。需要时文字可用\n或\N命令换行。ASS文件中,Script Info部分的一个参数“WrapStyle”也可以改变此值。
Outline. 边框样式,文字可以设定为有边框,无边框,或拥有不透明边框(矩形背景)。
Shadow. 阴影距离。文字的阴影到文字的距离大小。
AlphaLevel. 透明度(0至255有效)
Encoding. ASCII码中的文字编码方式。

1.2.3 主体

Events: 字幕的主体部分。
字幕的出现时间和样式、对样式的修改和特效均在这里编写。 其一般语法格式为:{\命令(参数,多个参数用逗号隔开)}, 例如 {\move(80,80,200,200,150,300)}.只有一个参数的命令不需要括号 (如. {\kf89}).

1.2.4 注意事项

一对大括号内可以放置多个语句。 如. {\bord8\be1}
换行的 \N 和 \n 命令不需要在两边加大括号就可使用。

1.3 双语字幕

[V4+ Styles]
Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding
Style: Default,Arial,16,&Hffffff,&Hffffff,&H0,&H0,0,0,0,0,100,100,0,0,1,1,0,2,10,10,10,0
Style: Chs,Arial,12,&Hcccccc,&Hcccccc,&H0,&H0,0,0,0,0,100,100,0,0,1,1,0,2,10,10,10,0
Style: Eng,Arial,20,&Hffffff,&Hffffff,&H0,&H0,0,0,0,0,100,100,0,0,1,1,0,2,10,10,10,0

[Events]
Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text
Dialogue: 0,0:01:06.63,0:01:07.63,Default,,0,0,0,,GIRL: Hey, Nat!\N{\rChs}女孩:嘿,纳特!
Dialogue: 0,0:01:37.08,0:01:38.71,Default,,0,0,0,,We're both upside down.\N{\rChs}我们两个都颠倒了。
Dialogue: 0,0:01:38.87,0:01:40.96,Default,,0,0,0,,And I bet you're gonna fall down first.\N{\rChs}我打赌你会先倒下。
Dialogue: 0,0:01:41.12,0:01:42.66,Default,,0,0,0,,No, you will.\N{\rChs}不,你会的。

2. srt

SubRip是一款适用于Microsoft Windows的免费软件程序,可将字幕及其时间从各种视频格式提取到文本文件中。它是在GNU GPL下发布的。其字幕格式的文件扩展名得到广泛支持。每个文件都是人类可读的文件格式,其中字幕与时序信息一起顺序存储。互联网上分发的大多数字幕都是这种格式。.srt

2.1 文件格式

序号开始: 标识顺序的数字计数器
时间起始: 字幕应该出现在屏幕上的时间 --> 它应该消失的时间
字幕内容: 一行或多行的字幕文本本身
空行结束: 一个不包含文本的空行,表示该标题的结束

2.2 样式

非正式地,该格式具有非常基本的文本格式,可以根据处理应用程序进行解释或传递以进行渲染。格式源自 HTML 标记的粗体、斜体、下划线和颜色:
粗体——<bold>…</bold>或{bold}…{/bold}
斜体 -<italic>…</italic>或{italic}…{/italic}
下划线 –<underline>…</underline>或{underline}…{/underline}
color 字体颜色 - <font color="color name or #code">…</font>(如在HTML 中)
position 行位置 -X1:… X2:… Y1:… Y2:…在时间戳之后表示文本坐标

2.3 位置

字幕摆放, 若不明示, 则处在底部居中位置, 即默认{\an2}. 可使用如下标识控制字幕出现的位置.
|\– 字幕靠左 字幕居中 字幕靠右
顶部 {\an7} {\an8} {\an9}
中间 {\an4} {\an5} {\an6}
底部 {\an1} {\an2} {\an3}

3. 小结

ass 相当于 srt + 简单样式表
  • 只需要单纯文本字幕时使用 srt
  • 需要样式文本字幕时使用 ass
常见的应用是中英双语字幕时, 使用ass可以很方便的分别控制2种语言的颜色, 字体大小.

3.1 列出支持的格式

$ ffmpeg -hide_banner -codecs | grep "^...S"
 ..S... = Subtitle codec
 DES... ass                  ASS (Advanced SSA) subtitle (decoders: ssa ass ) (encoders: ssa ass )
 ..S... srt                  SubRip subtitle with embedded timing
 ..S... ssa                  SSA (SubStation Alpha) subtitle
 DES... subrip               SubRip subtitle (decoders: srt subrip ) (encoders: srt subrip )
 DES... mov_text             MOV text
...

3.2 srt-ass

$ ffmpeg -i input.srt output.ass
$ ffmpeg -i out.ass out.srt

3.3 sbv-srt

ffmpeg -i captions.sbv captions.srt
ffmpeg -fix_sub_duration -i captions.sbv captions.srt

4. 字幕操作

4.1 软字幕(推荐)

软字幕是独立于视频流的字幕流信息, 可以加入多个, 删除也很方便, 视频不需要重新编码, 速度相当于复制文件.

4.1.1 提取字幕流

查看视频文件信息, 找到需要的字幕流
$ ffmpeg -i input.mkv
不指定map, 默认提取第一个字幕
$ ffmpeg -i input.mkv sub.srt
绝对map, 提取第6个流信息
$ ffmpeg -i input.mkv -map 0:5 sub.srt
相对map, 提取第4个字幕流信息
$ ffmpeg -i input.mkv -map 0:s:3 sub.srt

4.1.2 添加字幕流

添加1个字幕流
$ ffmpeg -i IceAge3.mp4 -i sub.english.srt -map 0 -map 1 -c copy -c:s mov_text -metadata:s:s:0 language=en IceAge3.en.mp4
$ ffmpeg -i IceAge3.mp4 -i sub.english.srt -map 0 -map 1 -c copy -c:s mov_text IceAge3.en1.mp4

在已有字幕的基础上添加新字幕
ffmpeg -i IceAge3.en.mp4 -i sub.chinese.srt -map 0 -map 1 -c copy -c:s mov_text IceAge3.encn.mp4

添加多个字幕流
$ ffmpeg -i IceAge3.mp4 -i sub.english.srt -i sub.chinese.srt -i sub.ass.en.ass -map 0 -map 1 -map 2 -map 3 -c copy -c:s mov_text -metadata:s:s:0 language=en -metadata:s:s:1 language=cn  -metadata:s:s:2 language=en.ass IceAge3sub.mp4
$ ffmpeg -i IceAge3.mp4 -i sub.english.srt -i sub.chinese.srt -i sub.ass.en.ass -map 0 -map 1 -map 2 -map 3 -c copy -c:s mov_text IceAge3sub.mp4
$ ffmpeg -i Trese.avi -i en.srt -i CN.srt -map 0:v -map 0:a -map 1 -map 2 -c:v copy -c:a copy -c:s mov_text -metadata:s:s:0 language=en -metadata:s:s:1 language=cn out2.mp4
$ ffmpeg -i Trese.avi -i en.srt -i CN.srt -map 0 -map 0:s:0 -map 0:s:1 -map 0:s:2 -c copy -c:s mov_text -metadata:s:s:0 language=en -metadata:s:s:1 language=cn out2.mp4

4.1.3 注意

不指定map则无效
ffmpeg -i input.mp4 -i sub.srt -c copy out.mp4
ffmpeg -i input.mp4 -i sub.srt -map 0 -c copy out.mp4

如下语法, 对于mp4无效, 对于mkv,则会增加字幕.
ffmpeg -i input.mp4 -i sub.srt -map 0 -map 1 -c copy out.mp4
$ ffmpeg -i input.mkv -i sub.srt -map 0 -map 1 -c copy out.mkv

完整语法:
$ ffmpeg -i input.mp4 -i sub.srt -map 0 -map 1 -c copy -c:s mov_text out.mp4
$ ffmpeg -i input.mp4 -i sub.srt -map 0 -map 1 -c copy -c:s mov_text -metadata:s:s:0 title=en out.mp4
$ ffmpeg -i input.mp4 -i sub.srt -map 0 -map 1 -c copy -c:s mov_text -metadata:s:s:0 language=en out.mp4

4.2 硬字幕(不推荐)

将字幕嵌入到视频帧中,这个过程需要重新编解码,所以速度比较慢。而且不可逆.
您可以使用以下两种过滤器之一来刻录文本字幕(硬字幕):subtitles或ass.
subtitles 滤镜
ffmpeg -i video.avi -vf subtitles=subtitle.srt out.avi
ffmpeg -i video.mkv -vf subtitles=video.mkv out.avi

ass 滤镜
ffmpeg -i video.avi -vf "ass=subtitle.ass" out.avi
它仅限于ASS(高级变电站阿尔法)字幕文件, 所以若是SubRip,MicroDVD或任何其他支持的文本字幕,您必须在使用此过滤器之前将其转换为 ASS:
ffmpeg -i subtitle.srt subtitle.ass

基于图片的字幕
你可以燃烧“基于图像的”字幕到一部电影中,通过使用叠加视频滤波器以覆盖图像。例如,dvdsub 是一种基于图片的叠加字幕。在单独的流中带有 dvdsub 字幕的 MKV 示例:
ffmpeg -i input.mkv -filter_complex "[0:v][0:s]overlay[v]" -map "[v]" -map 0:a <output options> output.mkv

5. 相关链接


2021-07-09

Windows-RW-LinuxFS

1. wsl2
	1.1 先决条件
	1.2 挂载未分区的磁盘
		1.2.1 识别磁盘
		1.2.2 挂载磁盘
	1.3 挂载分区磁盘
		1.3.1 识别磁盘
		1.3.2 列出并选择要在 WSL 2 中挂载的分区
		1.3.3 识别文件系统类型
		1.3.4 挂载选定的分区
	1.4 访问磁盘内容
	1.5 卸载磁盘
	1.6 在 WSL 中挂载 VHD
	1.7 命令行参考
	1.8 挂载特定分区
	1.9 指定挂载选项
	1.a 连接磁盘而不安装它
	1.b 分离磁盘
	1.c. 限制
2. linux-reader(只读)
3 商业软件
	3.1 paragon
	3.2. UFS Explorer
4. ext2read
5. Ext2Fsd
6. 文件系统对比

1. wsl2

在 WSL2 中挂载 Linux 磁盘(预览版) 04/08/2021
如果要访问 Windows 不支持的 Linux 磁盘格式,可以使用 WSL2 挂载磁盘并访问其内容。
注意: 将磁盘附加到 WSL2 需要管理员访问权限。 WSL2 mount命令不支持挂载当前正在使用的磁盘(或属于该磁盘的分区)。wsl --mount即使只请求一个分区,也总是附加整个磁盘。无法挂载 Windows 安装盘。
注! 下文命令行开头标识有如下2种:
  • > (大于号)开头的命令表示在Windows的PowerShell中.
  • $ (美元符号)开头的命令表示Linux的Bash环境.

1.1 先决条件

您需要使用 Windows 10 Build 20211 或更高版本才能访问此功能。您可以加入Windows预览体验计划以获取最新的预览版本。

1.2 挂载未分区的磁盘

在这种最简单的情况下,如果您的磁盘没有任何分区,则可以直接使用该wsl --mount命令挂载它。首先,您需要识别磁盘。

1.2.1 识别磁盘

要列出 Windows 中的可用磁盘,请在PowerShell中运行:
> wmic diskdrive list brief
磁盘路径在“DeviceID”列下可用。通常根据\\.\PHYSICALDRIVE*格式。

1.2.2 挂载磁盘

然后在 Powershell 中,您可以使用上面发现的磁盘路径挂载磁盘。
> wsl --mount <DiskPath>

1.3 挂载分区磁盘

1.3.1 识别磁盘

要列出 Windows 中的可用磁盘,请在PowerShell中运行:
> wmic diskdrive list brief
磁盘路径在“DeviceID”列下可用。通常根据\\.\PHYSICALDRIVE*格式。

1.3.2 列出并选择要在 WSL 2 中挂载的分区

> wsl --mount <DiskPath> --bare
这将使磁盘在 WSL 2 中可用。
连接后,可以通过在 WSL 2 中运行以下命令来列出分区(已经入Bash环境):
$ lsblk
这将显示可用的块设备及其分区。
在 Linux 中,块设备被标识为 /dev/<Device><Partition>. 例如,/dev/sdb3 是磁盘的分区号 3 sdb。

1.3.3 识别文件系统类型

如果您不知道磁盘或分区的文件系统类型,可以在PowerShell使用以下命令:
> blkid <BlockDevice>
这将输出检测到的文件系统类型(在TYPE="<Filesystem>"格式下)。

1.3.4 挂载选定的分区

确定要挂载的分区后,在每个分区上运行以下命令:
> wsl --mount <DiskPath> --partition <PartitionNumber> --type <Filesystem>
注意: 如果您希望将整个磁盘安装为单个卷(即如果磁盘未分区),--partition则可以省略。如果省略,则默认文件系统类型为“ext4”。

1.4 访问磁盘内容

安装后,可以在配置值指向的路径下访问磁盘:automount.root. 默认值为/mnt/wsl。
在 Windows 中,可以通过导航到以下位置从文件资源管理器访问磁盘:(\\wsl$\\<Distro>\\<Mountpoint>选择任何 Linux 发行版)。

1.5 卸载磁盘

如果要从 WSL 2 卸载和分离磁盘,请运行:
> wsl --unmount <DiskPath>

1.6 在 WSL 中挂载 VHD

您还可以使用wsl --mount. 为此,您首先需要使用 Windows 中的Mount-VHD命令将 VHD 挂载到 Windows中。请务必以管理员权限运行此命令。下面是我们使用此命令的示例,并输出磁盘路径。请务必替换<pathToVHD>为您的实际 VHD 路径。
> Write-Output "\\.\PhysicalDrive$((Mount-VHD -Path <pathToVHD> -PassThru | Get-Disk).Number)"
您可以使用上面的输出来获取此 VHD 的磁盘路径,然后按照上一节中的说明将其挂载到 WSL。

您还可以使用此技术挂载其他 WSL 发行版的虚拟硬盘并与之交互,因为每个 WSL 2 发行版都通过名为:ext4.vhdx. 默认情况下,WSL 2 发行版的 VHD 存储在以下路径中:C:\Users\[user]\AppData\Local\Packages\[distro]\LocalState\[distroPackageName],请谨慎访问这些系统文件,这是一个高级用户工作流程。确保wsl --shutdown在与此磁盘交互之前运行以确保该磁盘未在使用中。

1.7 命令行参考

挂载特定的文件系统, 默认情况下,WSL2 将尝试将设备挂载为 ext4。要指定另一个文件系统,请运行:
> wsl --mount <DiskPath> -t <FileSystem>
例如,要将磁盘挂载为 fat,请运行:
> wsl --mount <Diskpath> -t vfat
要列出 WSL2 中的可用文件系统,请运行:cat /proc/filesystems
当磁盘已通过 WSL2(Linux 文件系统)挂载后,无法再通过 Windows 文件系统上的 ext4 驱动程序挂载。

1.8 挂载特定分区

默认情况下,WSL 2 会尝试挂载整个磁盘。要挂载特定分区,请运行:
> wsl --mount <Diskpath> -p <PartitionIndex>
这仅在磁盘是 MBR(主引导记录)或 GPT(GUID 分区表)时才有效。阅读有关分区样式 - MBR 和 GPT 的信息。

1.9 指定挂载选项

要指定挂载选项,请运行:
> wsl --mount <DiskPath> -o <MountOptions>
> wsl --mount <DiskPath> -o "data=ordered"
注意: 目前仅支持文件系统特定选项。ro, rw, noatime, ...不支持诸如此类的通用选项。

1.a 连接磁盘而不安装它

如果上述任何选项都不支持磁盘方案,您可以通过运行将磁盘附加到 WSL 2 而无需安装它:
> wsl --mount <DiskPath> --bare
这将使块设备在 WSL 2 中可用,因此可以从那里手动安装。使用lsblk列出内部WSL 2可用块设备。

1.b 分离磁盘

要从 WSL 2 分离磁盘,请运行:
> wsl --unmount [DiskPath]
如果Diskpath省略,则卸载并分离所有附加的磁盘。
注意: 如果一个磁盘卸载失败,可以通过运行 强制退出 WSL 2 wsl --shutdown,这将分离磁盘。

1.c 限制

目前,只能将整个磁盘附加到 WSL 2,这意味着不可能只附加一个分区。具体来说,这意味着无法wsl --mount用于读取引导设备上的分区,因为该设备无法与 Windows 分离。
目前不支持 USB 闪存驱动器和 SD 卡,并且无法连接到 WSL 2。但支持 USB 磁盘。
只有内核本身支持的文件系统才能通过wsl --mount. 这意味着无法通过调用 来使用已安装的文件系统驱动程序(例如 ntfs-3g)wsl --mount。

2. linux-reader(只读)

从 Windows 访问 Ext、UFS、HFS、ReiserFS 或 APFS 文件系统上的文件和文件夹
Linux Reader™ 是一种流行的免费软件产品,它仍然是非商业免费软件。从 4.0 版开始,Linux Reader Pro™ 提供了额外的功能。
使用 Linux Reader Pro™,您可以从更多文件系统读取文件、通过 SSH 连接进行远程访问、创建虚拟驱动器、通过 FTP 导出文件等等。
  • Linux Reader™ 的所有重要功能仍然免费:没有烦人的广告、没有试用模式、没有限制。
  • Linux Reader™ 和 Linux Reader Pro™ 都为您提供对源驱动器的安全只读访问。
  • Linux Reader™ 和 Linux Reader Pro™ 绕过文件安全策略,因此您可以访问 Linux 磁盘上的任何文件。
  • Linux Reader™ 和 Linux Reader Pro™ 的系统要求:Windows 7、8 或 10。

3. 商业软件

3.1 paragon

3.2 UFS Explorer

4. ext2read

Ext2explore 是一款可以在 Windows 下浏览 ext2/3/4 分区的软件,小巧好用。

5. Ext2Fsd

正如其名称, 仅适用于Ext2.
稳定版本 0.6.9(2017年11月2日,​3年前)
Ext2Fsd(Ext2 File System Driver 的缩写)是一个免费的可 安装文件系统驱动程序,用C 语言编写,用于Microsoft Windows操作系统系列。它有助于对ext2、ext3和ext4 文件系统的读写访问。

错误
德国电脑杂志PC-WELT曾报道2009年程序崩溃频繁,程序无法顺利访问ext3分区。这常常导致蓝屏。这种类型的崩溃可能导致数据丢失,例如,如果主存储器中还没有永久存储的数据。该程序只能访问 ext2 分区而不会出错。
2012 年,Computerwoche警告说,访问 ext3 分区“并非无害”。可能会发生数据丢失。

严重错误
2017 年 11 月 2 日,发布了 0.69 版的警告:
不要在最新的 Ubuntu 或 Debian 系统上使用 Ext2Fsd 0.68 或更早版本。Ext2Fsd 0.68 无法在启用 64 位模式的情况下处理 EXT4,然后它可能会损坏您的数据。非常抱歉这个灾难问题,我正在努力改进。
虽然尚不清楚 v0.69 是否纠正了这一缺陷,但用户报告即使使用 0.69 版本,Windows 10 也会提示他们格式化 ext4 驱动器。已知的解决方案是将所述 ext4 驱动器转换为 32 位版本。

6. 文件系统对比


2021-07-01

Festival

1. Installation
2. Configuration配置
	2.1 Sound server 声音服务器
	2.2 Voices声音
	2.3 Manually手动
3. Usage用法
	3.1 使用festival
	3.2 Interactive交互的
	3.3 添加帮助信息
4. Troubleshooting故障排除
	4.1 无法打开 /dev/dsp
	4.2 Alsa 以错误的速度播放
	4.3 找不到命令 aplay
	4.4 Say报错
	4.5. Server
5 Speech-synthesizers语音合成器
	5.1 Arch库含有的
	5.2. 包含/usr/bin/命令

注: 上面官方手册是2014年的2.4版本; 当前安装的是2.5版本(2017?)...
Festival是CSTR(语音技术研究中心)开发的通用多语言语音合成系统。它提供了构建语音合成系统的通用框架,并包含各种模块的示例。总的来说,它通过许多 API 提供全文到语音:从 shell 级别,通过 Scheme 命令解释器,作为 C++ 库,从 Java 和 Emacs 接口。Festival是多语言的(目前有英式英语、美式英语、意大利语、捷克语和西班牙语,其他语言在原型中可用。)

1. Installation

$ sudo pacman -Ss festival
extra/festival 2.5.0-4 [installed]
    A general multi-lingual speech synthesis system
community/festival-english 2.5-2
    British and American English Male speaker
community/festival-us 2.5-2
    American Male/Female and Scottish English Male speaker

2. Configuration配置

没有全局/etc/配置文件,但您可以使用您的~/.festivalrc文件配置festival,或直接编辑/usr/share/festival/festival.scm. 这两个都是方案文件,使用方案语法并在每次festival运行时重新运行。

2.1 Sound server 声音服务器

如果来自其他来源的音频已经在播放,则以下内容允许 Festival 工作。添加到您的配置:
对于 PulseAudio:
(Parameter.set 'Audio_Required_Format'aiff)
(Parameter.set 'Audio_Method 'Audio_Command)
(Parameter.set 'Audio_Command "paplay $FILE --client-name=Festival --stream-name=Speech")
对于 ALSA:
(Parameter.set 'Audio_Method 'Audio_Command)
(Parameter.set 'Audio_Command "aplay -q -c 1 -t raw -f s16 -r $SR $FILE")

2.2 Voices声音

Arch 将官方语音集分为festival-us (recommended) and festival-english ...
要查看当前安装了哪些声音以及默认设置是什么,请首先进入 Festival 的#Interactive shell(REPL 方案)。要永久更改默认语音,请将其添加到您的配置中,例如:
(set! voice_default voice_cmu_us_rms_cg)
附加到/usr/share/festival/siteinit.scm适用于所有用户。

添加到.festivalrc后, 重新进入, 显示默认声音时会提示...没有定义的错误,但可以正常使用:
festival> voice_default
#<CLOSURE n (let-internal (me) (voice_cmu_us_slt_cg) (begin (require "/usr/share/festival/voices/us/cmu_us_slt_cg/festvox/cmu_us_slt_cg") (if (eq me voice_cmu_us_slt_cg) (error (string-append "autoload: \"" "/usr/share/festival/voices/us/cmu_us_slt_cg/festvox/cmu_us_slt_cg" ".scm\" does not define " (quote voice_cmu_us_slt_cg)))) (apply voice_cmu_us_slt_cg n)))>

2.3 Manually手动

您也可以直接从 Festvox 获得声音。您需要解压缩包含语音的文件夹并将其移动到其中,/usr/share/festival/voices/而判断包含语音的文件夹的方法是在其中查找festvox/子文件夹。然后,您可以通过加载festival提示来测试是否找到了您的新声音。

3. Usage用法

3.1 使用festival

测试:
$ echo "This is a test!" |festival --tts

读取文本文件:
$ festival --tts /home/tom/sptext.txt

要阅读您用光标突出显示的选择:
$ xsel |festival --tts
注: xsel是用于获取和设置 X 选择的内容命令行程序, 安装:$ sudo pacman -S xsel

将文本文件转换为 mp3 音频:
$ text2wave /home/tom/LoveOurCountry.txt | lame - text.mp3
Txt文件: lines: 19; Words: 294; char: 1554; Bytes: 1556; 
Mp3文件: size: 291.8Kb; 时长: 01:39

用选择的声音录制音频:
$ text2wave -o output.wav -eval '(voice_cmu_us_awb_cg)' /home/tom/LoveOurCountry2.txt
Txt文件: lines: 7; Words: 279; char: 1525; Bytes: 1529; 
Wav文件: size: 3.1Mb; 时长: 01:41

语音报时:
$ saytime
The time is now, almost twenty-five past 4, in the afternoon. 
$ saytime
The time is now, exactly twenty-five past 4, in the afternoon. 
$ saytime
The time is now, just after twenty-five past 4, in the afternoon. 

3.2 Interactive交互的

Festival 有一个交互式提示,可用于测试。键入festival以输入它。以下是一些示例:
显示默认声音:
festival> voice_default
voice_kal_diphone

列出可用的声音:
festival> (voice.list)
(rab_diphone kal_diphone cmu_us_rms_cg cmu_us_slt_cg cmu_us_awb_cg)

要选择另一种声音,请输入。例如: (voice_name)
festival> (voice_cmu_us_rms_cg)
cmu_us_rms_cg

听它说话:
festival> (SayText "Arch makes me happy")

列出可用命令:
festival> help

退出:
festival> (quit)

3.3 添加帮助信息

/usr/share/festival/festdoc.scm
配置文件的(defvar help这部分就是帮助信息了.
在初始默认声音下面,增加新安装的声音名称
  (voice_kal_diphone) Select voice (American Male)
  (voice_cmu_us_rms_cg)  Select voice (US Male s)
  (voice_cmu_us_slt_cg)  Select voice (US Female)
  (voice_cmu_us_awb_cg)  Select voice (Scottish Male)
再次进入festival, 获取帮助就能看到这些选择的提示了
festival> help

4. Troubleshooting故障排除

4.1 无法打开 /dev/dsp

如果节日返回以下错误消息:
Linux: can't open /dev/dsp

4.2 Alsa 以错误的速度播放

如果上述解决方案让您发出吱吱的声音,您可能想尝试更改您的aplay选项:
(Parameter.set 'Audio_Method 'Audio_Command)
(Parameter.set 'Audio_Command "aplay -Dplug:default -f S16_LE -r $SR $FILE")

4.3 找不到命令 aplay

安装alsa-utils包。

4.4 Say报错

festival> (SayText "Arch makes me happy")
-=-=-=-=-=- EST Warning -=-=-=-=-=-
audio_open_alsa: failed to set hw parameters. Invalid argument.
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
Segmentation fault (core dumped)

以下内容添加到.festivalrc即可
(Parameter.set 'Audio_Method 'Audio_Command)
(Parameter.set 'Audio_Command "aplay -q -c 1 -t raw -f s16 -r $SR $FILE")

4.5 Server

Install festival-freebsoft-utils(aur) to use Festival with speech-dispatcher (i.e. in Firefox's Reader).

5. Speech-synthesizers语音合成器

5.1 Arch库含有的

festival - 构建语音合成系统的通用框架以及各种模块的示例。总的来说,它提供全文到语音。
espeak — 适用于 50 多种语言的紧凑型语音合成器。
espeak-ng - eSpeak 的分支(由于原始维护者不活动)。
orca — 使用 eSpeak(通过 Speech Dispatcher)为盲人或视障人士提供的屏幕阅读器。
flite - 轻量级语音合成引擎。
kmouth — 语音合成器前端,使无法说话的人可以让他们的计算机说话。
speech-dispatcher - 语音合成的通用接口。它有 eSpeak、Festival 和其他一些语音合成器的后端。

5.2 包含/usr/bin/命令

espeak : espeak
espeak-ng : espeak-ng
espeak-ng : speak-ng
orca : orca
flite : flite
flite : flite_cmu_us_kal16
flite : flite_cmu_us_slt
kmouth : kmouth GUI图形界面
speech-dispatcher : spd-conf
speech-dispatcher : spd-say
speech-dispatcher : spdsend
speech-dispatcher : speech-dispatcher
speech-dispatcher usr/lib/systemd/system/speech-dispatcherd.service

2021-06-30

ffmpeg-metadata

1. 设置元数据
	1.1 设置文件标题
	1.2 删除所有流标题
	1.3 设置音频流语言
	1.4 选项说明
2. 元数据文件-章节
	2.1 提取元数据
	2.2 编辑元数据文件
	2.3 加载元数据文件
	2.4 元数据文件说明
	2.5 选项说明
3. 设置默认流
	3.1 删除第一个音频流的默认属性,设置第二个音频流为默认
	3.2 选项说明

1. 设置元数据

1.1 设置文件标题

$ ffmpeg -i Jurassic.World.mkv -map 0 -c copy -metadata title="Jurassic World" out.mkv
$ ffprobe -hide_banner out.mkv 
Input #0, matroska,webm, from 'out.mkv':
  Metadata:
    title           : Jurassic World

1.2 删除所有流标题

$ ffmpeg -i Jurassic.World-2015.mkv -map 0 -c copy -metadata:s title="" out.mkv
删除0号流标题
$ ffmpeg -i Jurassic.World-2015.mkv -map 0 -c copy -metadata:s:0 title="" out.mkv
修改前: 
$ ffprobe -hide_banner Jurassic.World.mkv 
Input #0, matroska,webm, from 'Jurassic.World-2015.mkv':
  Metadata:
    title           : www.------.com
  Stream #0:0(eng): Video: h264 (High), yuv420p(tv, bt709/bt709/unknown, progressive), 1920x960, SAR 1:1 DAR 2:1, 23.98 fps, 23.98 tbr, 1k tbn, 47.95 tbc (default)
    Metadata:
      title           : ------.com
  Stream #0:1(hin): Audio: aac (LC), 48000 Hz, stereo, fltp
    Metadata:
      title           : ------.com
  Stream #0:2(eng): Audio: aac (LC), 48000 Hz, stereo, fltp (default)
    Metadata:
      title           : ------.com

1.3 设置音频流语言

$ ffprobe -hide_banner Jurassic.World-2015.mkv 
  Stream #0:1(hin): Audio: aac (LC), 48000 Hz, stereo, fltp
$ ffmpeg -i Jurassic.World-2015.mkv -map 0 -c copy -metadata:s:a:0 language=eng out.mkv
$ ffprobe -hide_banner out.mkv 
  Stream #0:1(eng): Audio: aac (LC), 48000 Hz, stereo, fltp

1.4 选项说明

-metadata[:metadata_specifier] key=value (output,per-metadata)
设置元数据键/值对。可以给出可选的metadata_specifier来设置流、章节或节目的元数据。有关-map_metadata 详细信息,请参阅文档。
此选项会覆盖使用-map_metadata. 也可以使用空值删除元数据。
例如,在输出文件中设置标题:
  ffmpeg -i in.avi -metadata title="my title" out.flv
设置第一个音频流的语言:
  ffmpeg -i INPUT -metadata:s:a:0 language=eng OUTPUT

-map_chapters input_file_index (output)
将具有索引input_file_index 的输入文件中的章节复制到下一个输出文件。如果未指定章节映射,则从包含至少一个章节的第一个输入文件复制章节。使用负文件索引禁用任何章节复制。

-program [title=title:][program_num=program_num:]st=stream[:st=stream...] (output)
创建具有指定的节目标题,program_num和指定添加 流(多个)给它。

2. 元数据文件-章节

2.1 提取元数据

分别提取包含及不包含章节的元数据
$ ffmpeg -i IceAge3.mp4 -f ffmetadata fmetadata.txt

2.2 编辑元数据文件

参照编辑元数据文件, 添加章节
[CHAPTER]
TIMEBASE=1/1000
START=190000
# 00:03:10 - 00:06:00 | 170
END=360000
title=Chapter 02a False alarm!
[CHAPTER]
TIMEBASE=1/1000
START=360000
# 00:06:00 - 00:11:00 | 300
END=660000
title=Chapter 03a Playground for Junior
...

2.3 加载元数据文件

$ ffmpeg -i IceAge3.mp4 -i fmetadata.txt -map_metadata 1 -codec copy out.mp4
打开这个新的视频文件, VLC播放器下面多出了前进或后退到章节的按钮. 鼠标移动到进度栏, 就会显示出章节的节点及当前位置的标题名称.

2.4 元数据文件说明

FFmpeg 能够将媒体文件中的元数据转储到一个简单的 UTF-8 编码的类似 INI 的文本文件中,然后使用元数据复用器/解复用器将其加载回来。
文件格式如下:
  • 一个文件由一个标题和许多元数据标签组成,这些标签分为多个部分,每个部分占一行。
  • 标头是一个‘;FFMETADATA’字符串,后跟一个版本号(现在是 1)。
  • 元数据标签的形式为‘key=value’
  • 全局元数据紧跟在标头之后
  • 在全局元数据之后,可能会有包含每个流/每个章节(per-stream/per-chapter)元数据的部分。
  • 一个部分以大写的部分名称(即 STREAM 或 CHAPTER)在方括号(‘[’、‘]’)中开始,并以下一个部分或文件结尾结束。
  • 在chapter章节部分的开头,可能有一个可选的时基用于开始/结束值。它必须采用‘TIMEBASE=num/den’形式,其中 num 和 den 是整数。如果缺少时基,则假定开始/结束时间以纳秒为单位。
  • 接下来,chapter章节部分必须包含格式为‘START=num’、‘END=num’的章节开始和结束时间,其中 num 是一个正整数。
  • 空行和以“;”或“#”开头的行将被忽略。
  • 包含特殊字符(‘=’、‘;’、‘#’、‘\’和换行符)的元数据键或值必须用反斜杠‘\’转义。
  • 请注意,元数据中的空格被认为是标签的一部分(e.g. ‘foo = bar’)(这里的 key 是 ‘foo ’, value 是 ‘ bar’).
ffmetadata 文件可能如下所示:
;FFMETADATA1
title=bike\\shed
;this is a comment
artist=FFmpeg troll team

[CHAPTER]
TIMEBASE=1/1000
START=0
#chapter ends at 0:01:00
END=60000
title=chapter \#1
[STREAM]
title=multi\
line
通过使用 ffmetadata muxer 和 demuxer,可以将元数据从输入文件提取到 ffmetadata 文件,然后将文件转码为带有编辑过的 ffmetadata 文件的输出文件。
使用 ffmpeg 提取 ffmetadata 文件如下:
ffmpeg -i INPUT -f ffmetadata FFMETADATAFILE
从 FFMETADATAFILE 文件重新插入编辑过的元数据信息可以通过以下方式完成:
ffmpeg -i INPUT -i FFMETADATAFILE -map_metadata 1 -codec copy OUTPUT

2.5 选项说明

-map_metadata[: metadata_spec_out ] infile [: metadata_spec_in ] ( output,per-metadata )
从infile设置输出文件的元数据信息。请注意,这些是文件索引(从零开始),而不是文件名。可选的metadata_spec_in/out参数指定要复制的元数据。元数据说明符可以具有以下形式:
g  全局元数据,即适用于整个文件的元数据
s[:stream_spec]  每个流元数据。stream_spec是流说明符,如流说明符章节中所述。在输入元数据说明符中,复制第一个匹配的流。在输出元数据说明符中,所有匹配的流都被复制到。
c:chapter_index  每章元数据。chapter_index是从零开始的章节索引。
p:program_index  每个程序的元数据。program_index是从零开始的节目索引。
如果省略元数据说明符,则默认为全局。
默认情况下,全局元数据从第一个输入文件复制,每个流和每个章节的元数据与流/章节一起复制。通过创建相关类型的任何映射来禁用这些默认映射。负文件索引可用于创建仅禁用自动复制的虚拟映射。
例如,将元数据从输入文件的第一个流复制到输出文件的全局元数据:
  ffmpeg -i in.ogg -map_metadata 0:s:0 out.mp3
反过来,也就是将全局元数据复制到所有音频流:
  ffmpeg -i in.mkv -map_metadata:s:a 0:g out.mkv
请注意,简单的0在此示例中也能正常工作,因为默认情况下采用全局元数据。

3. 设置默认流

3.1 删除第一个音频流的默认属性,设置第二个音频流为默认

$ ffmpeg -i input.mkv -hide_banner
  Stream #0:0: Video: h264 (High), yuv420p(tv, progressive), 1080x454 [SAR 908:909 DAR 240:101], SAR 1:1 DAR 540:227, 23.98 fps, 23.98 tbr, 1k tbn, 47.95 tbc (default)
  Stream #0:1(hin): Audio: vorbis, 48000 Hz, 5.1, fltp (default)
  Stream #0:2(eng): Audio: vorbis, 48000 Hz, 5.1, fltp
  Stream #0:3(eng): Subtitle: ass (default)

$ ffmpeg -i input.mkv -map 0 -c copy -disposition:a:0 0 -disposition:a:1 default out.mkv

$ ffprobe -hide_banner out.mkv 
  Stream #0:0: Video: h264 (High), yuv420p(tv, progressive), 1080x454 [SAR 908:909 DAR 240:101], SAR 1:1 DAR 540:227, 23.98 fps, 23.98 tbr, 1k tbn, 47.95 tbc (default)
  Stream #0:1(hin): Audio: vorbis, 48000 Hz, 5.1, fltp
  Stream #0:2(eng): Audio: vorbis, 48000 Hz, 5.1, fltp (default)
  Stream #0:3(eng): Subtitle: ass (default)

3.2 选项说明

$ man ffmpeg |grep -A 10 disposition
-disposition[:stream_specifier] value (output,per-stream)
设置流的处置。此选项会覆盖从输入流复制的处置。也可以通过将其设置为 0 来删除处置。
认可以下处置:
default; dub 配音; original 原来的; comment 评论; lyrics 歌词; karaoke 卡拉OK; forced 被迫; hearing_impaired 听力障碍; visual_impaired 视觉障碍; clean_effects 清洁效果; attached_pic 附加图片; captions 字幕; descriptions 说明; dependent 依赖; metadata 元数据.
例如,要使第二个音频流成为默认流:
  ffmpeg -i in.mkv -c copy -disposition:a:1 default out.mkv
要使第二个字幕流成为默认流并从第一个字幕流中删除默认配置:
  ffmpeg -i in.mkv -c copy -disposition:s:0 0 -disposition:s:1 default out.mkv
要添加嵌入式封面/缩略图:
  ffmpeg -i in.mp4 -i IMAGE -map 0 -map 1 -c copy -c:v:1 png -disposition:v:1 attached_pic out.mp4
并非所有多路复用器都支持嵌入式缩略图,支持的多路复用器仅支持几种格式,例如 JPEG 或 PNG。

2021-06-26

FFmpeg-Screen-Recording

1. Linux 系统
2. 苹果 OS X 系统
3. Windows 系统
	3.1 使用 DirectShow ​device设备采集音视频数据:
	3.2 使用内置 GDI 屏幕抓取器
4. 硬件编码
5. 无损录制
6. 无损录音
7. 更多例子参考
8. See also

以下是一些使用 ffmpeg 捕获桌面和录制屏幕视频的解决方案。
为简洁起见,这些命令没有指定任何额外的编码器设置。
默认情况下,这些命令将使用 x264 编码器,这在现代机器上应该相当快。

1. Linux 系统

使用 x11grab 设备采集视频图像:
$ ffmpeg -video_size 1024x768 -framerate 25 -f x11grab -i :0.0+100,200 output.mp4
这条命令将会从桌面图像的左上角偏移坐标位置为 (x=100, y=200)处获取宽高为1024x768的图像, .
如果需要加入音频,则采集 ALSA: 
$ ffmpeg -video_size 1024x768 -framerate 25 -f x11grab -i :0.0+100,200 -f alsa -ac 2 -i hw:0 output.mkv
或者采集 pulse 输入设备:
$ ffmpeg -video_size 1024x768 -framerate 25 -f x11grab -i :0.0+100,200 -f pulse -ac 2 -i default output.mkv

2. 苹果 OS X 系统

使用 avfoundation 设备采集音视频:
ffmpeg -f avfoundation -list_devices true -i ""
这条命令执行后将列出所有 avfoundation 的音频、视频采集设备列表。 可以通过指定想要采集的设备名采集音频、视频:
ffmpeg -f avfoundation -i "<screen device index>:<audio device index>" out.mov
这条命令执行后将会从 <screen device index> 编号处获得视频图像,从 <audio device index> 编号处获得音频数据写入至输出文件 out.mov 中.

3. Windows 系统

3.1 使用 DirectShow device设备采集音视频数据:

ffmpeg -f dshow -i video="screen-capture-recorder" output.flv
执行这条命令后将会 从DirectShow 设备中获得桌面图像并输出为output。flv文件. 
如果需要采集视频外还需要采集音频则使用如下命令:
ffmpeg -f dshow -i video="UScreenCapture":audio="Microphone" output.flv
如果你想获得正在从扬声器播放的音频,需要配置 “Stereo Mix” 设备
或者
ffmpeg -f dshow -i video="UScreenCapture" -f dshow -i audio="Microphone" output.flv
可以通过如下命令行列出所有dshow设备:
ffmpeg -list_devices true -f dshow -i dummy
同样可以使用 gdigrab 输入设备从Widnows系统桌面获得屏幕图像.

3.2 使用内置 GDI 屏幕抓取器

您还可以使用gdigrab作为输入设备从 Windows 屏幕抓取视频。
要将所有显示捕获为一个大的连续显示:
ffmpeg -f gdigrab -framerate 30 -i desktop output.mkv

如果你想限制到一个区域,并显示被抓取的区域:
ffmpeg -f gdigrab -framerate 30 -offset_x 10 -offset_y 20 -video_size 640x480 -show_region 1 -i desktop output.mkv

获取名为“Calculator”的窗口的内容:
ffmpeg -f gdigrab -framerate 30 -i title=Calculator output.mkv

4. 硬件编码

您可以使用硬件加速来加速编码并减少 CPU 的负载。例如,使用 NVIDIA 硬件编码:
ffmpeg -f gdigrab -framerate 30 -i desktop -c:v h264_nvenc -qp 0 output.mkv

5. 无损录制

如果你想很好的将桌面图像录制下来,x264编码器可以做到,使用无损编码方式即可,例如:
$ ffmpeg -video_size 1920x1080 -framerate 30 -f x11grab -i :0.0 -c:v libx264 -qp 0 -preset ultrafast capture.mkv
-qp 0 这个参数是设置 x264 的压缩参数为无损压缩, -preset ultrafast 预设值参数将会尽快的进行 x264 编码压缩.
这么做在当前主流的硬件设备上做不丢帧的编码是可以做到足够快的,并且还不会占用全部的CPU。

可以通过一次录制,一次编码的方式进行无损编码压缩,录制的时候以最快速度将视频图像录制下来,然后对录制下来的图像进行慢速压缩,这样可以保证图像质量,并且可以保证视频不丢帧
$ ffmpeg -i capture.mkv -c:v libx264 -qp 0 -preset veryslow capture_smaller.mkv

6. 无损录音

如果您的 CPU 不够快,则编码过程可能需要很长时间。为了加快编码过程,您可以使用无损编码并禁用高级编码器选项,例如:
ffmpeg -video_size 1920x1080 -framerate 30 -f x11grab -i :0.0 -c:v libx264rgb -crf 0 -preset ultrafast output.mkv
-crf 0告诉 x264 以无损模式编码;-preset ultrafast建议它做这么快。注意使用libx264rgb而不是libx264; 后者将进行从 RGB 到 yuv444p 的有损转换。

编码器在大多数现代硬件上应该足够快,可以在没有任何丢帧的情况下进行录制,甚至为其他应用程序留出足够的 CPU 空间。
如果您要存档录音或担心文件大小,请再次无损重新编码,但预设速度较慢。请注意,由于初始录制是无损的,重新编码也是无损的,因此在此过程中不会以任何方式引入质量损失。
ffmpeg -i output.mkv -c:v libx264rgb -crf 0 -preset veryslow output-smaller.mkv

7. 更多例子参考

如果你的配置比较低, 使用下面的命令可能会提高你的音视频编码效率,但是质量会稍微有些降低. 在这种情况下,首先你需要获取并将获取的图像保存为未压缩的视频/音频,并且当你完成抓取过程然后开始将它转换为任何你所需要的编码:

Linux:
$ ffmpeg -framerate 25 -video_size 1024x768 -f x11grab -i :0.0+100,200 -f alsa -ac 2 -i pulse -vcodec libx264 -crf 0 -preset ultrafast -acodec pcm_s16le output.mkv
$ ffmpeg -i output.mkv -acodec ... -vcodec ... final.mkv

Windows:
ffmpeg -f dshow -i video="screen-capture-recorder":audio="Microphone" -vcodec libx264 -crf 0 -preset ultrafast -acodec pcm_s16le output.mkv
ffmpeg -i output.flv -acodec ... -vcodec ... final.mkv

8. See also

Windows 替代设备列表: 

ffmpeg-map

1. 使用 -map 选项选择流
	1.1 examples简单的例子
	1.2 behavior默认行为
2. Syntax语法
	2.1 Modifiers修饰符
	2.2 Order顺序
3. Examples例子
	3.1 选择所有流
	3.2 特定类型的流
	3.3 仅特定视频流
	3.4 来自不同文件的视频和音频
	3.5 除音频外的所有内容
	3.6 特定语言
	3.7 从过滤器中选择输出
	3.8 多路输出
	3.9 可选映射
	3.a 重新排序流
4. See also

1. 使用 -map 选项选择流

  • top 命令不使用任何流说明符。这是一种绝对的映射方法,无论类型如何,都会选择特定的流。
    • -map 0:0  第一个输入文件的第一个流
    • -map 1:3  第二个输入文件的第四个流
  • bottom 命令包括流说明符(v视频, a音频, s字幕, m元数据)以将流限制为特定类型。
    • -map 0:v:0  第一个输入文件的第一个视频流
    • -map 1:a:2  第二个输入文件的第三个音频流
    • -map 1:s:1  第二个输入文件的第二个字幕流

1.1 examples简单的例子

  • -map 0  从输入索引 #0(第一个输入)中选择所有流。
  • -map 1:a  从输入索引 #1(第二个输入)中选择所有音频流。
  • -map 3:s:4  从输入索引#3(第四个输入)选择字幕流索引#4(第五个字幕流)。
  • -map 0 -map -0:s  将从输入索引 #0(第一个输入)中选择除字幕之外的所有流。-指负映射。

1.2 behavior默认行为

如果您不使用该-map选项,则默认流选择行为将自动选择流。
  • 默认流选择不会自动选择所有流。
  • 每种类型仅选择 1 个流。例如,如果输入有 3 个视频流,它只会选择 1 个。
  • 默认流选择将根据特定标准选择流。
  • 使用该-map选项会禁用默认流选择行为,并允许您手动选择流。

2. Syntax语法

-map input_file_index:stream_type_specifier:stream_index

  • input_file_index  指的是一个输入,默认情况下将包括它的所有流。
  • stream_type_specifier  (可选)是一个流说明符,它将选择限制为特定的流类型。流符包括vIDEO,aUDIO,subtitles,dATA,一个ttachments。下面的大多数示例都使用流说明符。
  • stream_index  (可选)将选择一个特定的流。如果stream_type_specifier使用,则stream_indexonly 引用选定的流类型并忽略所有其他流类型。
注意:索引号从 0 开始。所以第一个输入或流是#0,第二个输入或流是#1,第三个输入或流是#2,等等。

2.1 Modifiers修饰符

  • -索引input_file_index,如-map -0:v,创建了一个负的映射。这不包括先前map已经选择的流。
  • 尾随?,例如-map 1:a?,将允许map是可选的。如果map不匹配任何流,则map将被忽略而不是失败。请注意,如果使用无效,映射仍然会失败input_file_index;例如,如果map引用不存在的输入。

2.2 Order顺序

-map order 确定输出中的流顺序。
映射按顺序应用。这在使用负映射时很有用。

3. Examples例子

提示:您可以添加-c copy到这些示例中的许多以启用流复制模式。如果您只想多路复用并避免编码,这很有用。

3.1 选择所有流

单输入:
ffmpeg -i input.avi -map 0 output.mkv

多个输入:
ffmpeg -i input0.mkv -i input1.mp4 -i input2.wav -map 0 -map 1 -map 2 output.mkv

使用流复制重新混合(无编码):
ffmpeg -i input.avi -map 0 -c copy output.mkv

3.2 特定类型的流

仅视频流
ffmpeg -i input.mp4 -map 0:v output.mp4
仅音频流
ffmpeg -i input.mp4 -map 0:a output.mp4

3.3 仅特定视频流

选择第 5 个视频流:
ffmpeg -i input.mkv -map 0:v:4 output.mp4

3.4 来自不同文件的视频和音频

ffmpeg -i video.mp4 -i audio.m4a -map 0:v -map 1:a output.mp4

3.5 除音频外的所有内容

使用负映射:
ffmpeg -i input.mp4 -map 0 -map -0:a output.mp4

3.6 特定语言

包括所有视频和所有带有西班牙语元数据的流:
ffmpeg -i input.mkv -map 0:v -map 0:m:language:spa output.mp4
见ISO名单639-1码为3个字母的语言名称。

3.7 从过滤器中选择输出

在这个例子中,过滤后的视频被命名[v],过滤后的音频被命名为[a]:
ffmpeg -i input.mp4 -i logo.png -i audio.mp3 -filter_complex "[0]scale=1280:-1[bg];[bg][1]overlay[v];[2:a]volume=-3dB[a]" -map "[v]" -map "[a]" output.mp4
您几乎可以使用任何任意名称来标记过滤器输出。

3.8 多路输出

将视频输出到video.mp4. 将音频流索引 #1(第二个音频流)输出到audio_1.mp3. 将音频流索引 #3(第四个音频流)输出到audio_3.wav:
ffmpeg -i input.mkv -map 0:v video.mp4 -map 0:a:1 audio_1.mp3 -map 0:a:3 audio_3.wav

3.9 可选映射

如果流不存在, 添加尾随问号 ( ?)-map将忽略映射。
要映射视频和音频流并在不存在音频流时忽略音频映射:
ffmpeg -i input.webm -map 0:v -map 0:a? output.mkv
如果改为使用-map 0:a,并且没有音频流,ffmpeg则将失败并显示Stream map '0:a' matches no streams. To ignore this, add a trailing '?' to the map..

3.a 重新排序流

你的顺序-map选择决定了输出流的顺序。在这个例子中,输入文件将音频作为流#0 和视频作为流#1(这可能但不寻常)。重新定位视频的示例,使其首先列出,然后是音频:
ffmpeg -i input.mp4 -map 0:v -map 0:a -c copy output.mp4

4. See also

2021-06-22

ffmpeg-utils

1. 说明
2. Syntax 语法
2.1 Quoting and escaping 引用和转义
2.2 Date 日期
2.3 Time duration 持续时间
2.4 Video size 视频大小
2.5 Video rate 视频速率
2.6 Ratio 比率
2.7 Color 颜色
2.8 Channel Layout 通道布局
2.8.1 各个频道由 id 标识,如下表所示:
2.8.2 可以使用以下标识符指定标准通道布局组合:
2.8.3 各频道id空间图示: 
2.8.4 自定义通道布局
3 Expression Evaluation 表达式评估
3.1 functions
3.2 constants 常数
3.3. International System prefixes 国际系统前缀

ffmpeg-utils

下文是ffmpeg官方页面(2021-06-17)的google自动翻译, 请参阅如下原文。

1. 说明

本文档描述了 libavutil 库提供的一些通用功能和实用程序。

2. Syntax 语法

本节记录了 FFmpeg 库和工具使用的语法和格式。

2.1 Quoting and escaping 引用和转义

除非明确指定,FFmpeg 采用以下引用和转义机制。应用以下规则:
  • ‘'’ and ‘\’ 是特殊字符(分别用于引用和转义)。除了它们之外,根据使用转义和引用的特定语法,可能还有其他特殊字符。
  • 特殊字符通过在它前面加上 ‘\’ 进行转义。
  • 包含在 ‘''’  之间的所有字符 字面上包含在解析的字符串中。引号字符 ''' 本身不能被引用,因此您可能需要关闭引用并转义它。
  • 除非转义或引用,否则将从解析的字符串中删除前导和尾随空格。
请注意,在使用命令行或脚本时,您可能需要添加第二级转义,这取决于所采用的 shell 语言的语法。
在av_get_token定义 的函数libavutil / avstring.h 可用于根据上面定义的规则解析引用或转义的标记。
工具 tools/ffescape 在FFmpeg 源代码树中的 可用于自动引用或转义脚本中的字符串。

2.2 Date 日期

接受的语法是:
[(YYYY-MM-DD|YYYYMMDD)[T|t| ]]((HH:MM:SS[.m...]]])|(HHMMSS[.m...]]]))[Z]
now
如果值为“now”,则表示当前时间。
时间是本地时间,除非附加了 Z,在这种情况下,它被解释为 UTC。如果未指定年月日部分,则采用当前年月日。

2.3 Time duration 持续时间

有两种可接受的语法来表示持续时间。
[-][HH:]MM:SS[.m...]
HH表示小时数,MM表示分钟数,最多 2 位,SS表示秒数,最多 2 位。末尾的m表示SS 的十进制值 。
或者
[-]S+[.m...][s|ms|us]
S表示秒数,带有可选的小数部分 m。可选的文字后缀 's', 'ms', 'us' 表示将值分别解释为秒、毫秒或微秒。
在这两个表达式中,可选的 '-' 表示负持续时间。

Examples
The following examples are all valid time duration:
‘55’ 55 seconds
‘0.2’ 0.2 seconds
‘200ms’ 200 milliseconds, that’s 0.2s
‘200000us’ 200000 microseconds, that’s 0.2s
‘12:03:45’ 12 hours, 03 minutes and 45 seconds
‘23.189’ 23.189 seconds

2.4 Video size 视频大小

指定源视频的尺寸, 它可以是宽度x高度形式的字符串, 或者是尺寸缩写的名称。以下缩写被认可:
name size X*Y ↓ y/(x/16);16:?
sqcif 128x96 12288 12
qqvga 160x120 19200 12
qcif 176x144 25344 13.0909
hqvga 240x160 38400 10.6667
cga 320x200 64000 10
qvga 320x240 76800 12
qntsc 352x240 84480 10.9091
film 352x240 84480 10.9091
ntsc-film 352x240 84480 10.9091
wqvga 400x240 96000 9.6
qpal 352x288 101376 13.0909
cif 352x288 101376 13.0909
fwqvga 432x240 103680 8.8889
hvga 480x320 153600 10.6667
ega 640x350 224000 8.75
nhd 640x360 230400 9
sntsc 640x480 307200 12
vga 640x480 307200 12
ntsc 720x480 345600 10.6667
4cif 704x576 405504 13.0909
wvga 852x480 408960 9.0141
hd480 852x480 408960 9.0141
pal 720x576 414720 12.8
spal 768x576 442368 12
svga 800x600 480000 12
qhd 960x540 518400 9
xga 1024x768 786432 12
hd720 1280x720 921600 9
wxga 1366x768 1049088 8.9956
sxga 1280x1024 1310720 12.8
16cif 1408x1152 1622016 13.0909
wsxga 1600x1024 1638400 10.24
2kscope 2048x858 1757184 6.703
uxga 1600x1200 1920000 12
hd1080 1920x1080 2073600 9
2kflat 1998x1080 2157840 8.6486
2k 2048x1080 2211840 8.438
2kdci 2048x1080 2211840 8.438
wuxga 1920x1200 2304000 10
qxga 2048x1536 3145728 12
woxga 2560x1600 4096000 10
qsxga 2560x2048 5242880 12.8
wqsxga 3200x2048 6553600 10.24
4kscope 4096x1716 7028736 6.703
uhd2160 3840x2160 8294400 9
4kflat 3996x2160 8631360 8.6486
4k 4096x2160 8847360 8.438
4kdci 4096x2160 8847360 8.438
wquxga 3840x2400 9216000 10
hsxga 5120x4096 20971520 12.8
whsxga 6400x4096 26214400 10.24
uhd4320 7680x4320 33177600 9
whuxga 7680x4800 36864000 10

2.5 Video rate 视频速率

指定视频的帧速率,表示为每秒生成的帧数。它必须是格式为frame_rate_num / frame_rate_den的字符串 、整数、浮点数或有效的视频帧速率缩写。
以下缩写被认可:
‘ntsc’ 30000/1001
‘pal’ 25/1
‘qntsc’ 30000/1001
‘qpal’ 25/1
‘sntsc’ 30000/1001
‘spal’ 25/1
‘film’ 24/1
‘ntsc-film’ 24000/1001

2.6 Ratio 比率

比率可以表示为表达式,或以分子:分母的形式表示 。
请注意,无限 (1/0) 或负值的比率被认为是有效的,因此如果要排除这些值,则应检查返回值。
未定义的值可以使用“0:0”字符串表示。

2.7 Color 颜色

它可以是如下定义的颜色名称(不区分大小写匹配)或 [0x|#]RRGGBB[AA]序列,可能后跟 @ 和表示 alpha 分量的字符串。
alpha分量可以是由“0x”后跟一个十六进制数或0.0到1.0之间的十进制数组成的字符串,表示不透明度值('0x00' 或者 '0.0' 表示完全透明,'0xff' 或者 '1.0' 完全不透明)。如果未指定 alpha 分量,则 '0xff' 假设。
字符串 'random' 将产生随机颜色。
识别以下颜色名称:
$ ffmpeg -colors color cn #RRGGBB
AliceBlue #f0f8ff 爱丽丝蓝 #f0f8ff
AntiqueWhite #faebd7 古董白 #faebd7
Aqua #00ffff 水族 #00ffff
Aquamarine #7fffd4 蓝晶 #7fffd4
Azure #f0ffff 天蓝色 #f0ffff
Beige #f5f5dc 浅褐色的 #f5f5dc
Bisque #ffe4c4 浓汤 #ffe4c4
Black #000000 黑色的 #000000
BlanchedAlmond #ffebcd 杏仁白 #ffebcd
Blue #0000ff 蓝色的 #0000ff
BlueViolet #8a2be2 紫罗兰色 #8a2be2
Brown #a52a2a 棕色的 #a52a2a
BurlyWood #deb887 原木色 #deb887
CadetBlue #5f9ea0 藏青 #5f9ea0
Chartreuse #7fff00 黄绿色 #7fff00
Chocolate #d2691e 巧克力 #d2691e
Coral #ff7f50 珊瑚 #ff7f50
CornflowerBlue #6495ed 矢车菊蓝 #6495ed
Cornsilk #fff8dc 玉米穗黄 #fff8dc
Crimson #dc143c 深红色 #dc143c
Cyan #00ffff 青色 #00ffff
DarkBlue #00008b 深蓝 #00008b
DarkCyan #008b8b 深青色 #008b8b
DarkGoldenRod #b8860b 深金黄 #b8860b
DarkGray #a9a9a9 深灰色 #a9a9a9
DarkGreen #006400 深绿色 #006400
DarkKhaki #bdb76b 深卡其色 #bdb76b
DarkMagenta #8b008b 深洋红色 #8b008b
DarkOliveGreen #556b2f 深橄榄绿 #556b2f
Darkorange #ff8c00 深橙色 #ff8c00
DarkOrchid #9932cc 深兰花紫 #9932cc
DarkRed #8b0000 深红 #8b0000
DarkSalmon #e9967a 深橙红 #e9967a
DarkSeaGreen #8fbc8f 海藻绿 #8fbc8f
DarkSlateBlue #483d8b 深青蓝 #483d8b
DarkSlateGray #2f4f4f 深青灰 #2f4f4f
DarkTurquoise #00ced1 深粉蓝 #00ced1
DarkViolet #9400d3 暗紫 #9400d3
DeepPink #ff1493 深粉红 #ff1493
DeepSkyBlue #00bfff 深蓝 #00bfff
DimGray #696969 暗灰色 #696969
DodgerBlue #1e90ff 道奇蓝 #1e90ff
FireBrick #b22222 耐火砖 #b22222
FloralWhite #fffaf0 花白 #fffaf0
ForestGreen #228b22 森林绿 #228b22
Fuchsia #ff00ff 紫红色 #ff00ff
Gainsboro #dcdcdc 亮灰 #dcdcdc
GhostWhite #f8f8ff 鬼白 #f8f8ff
Gold #ffd700 金色的 #ffd700
GoldenRod #daa520 金棒 #daa520
Gray #808080 灰色的 #808080
Green #008000 绿色的 #008000
GreenYellow #adff2f 黄绿色 #adff2f
HoneyDew #f0fff0 甘露 #f0fff0
HotPink #ff69b4 亮粉色 #ff69b4
IndianRed #cd5c5c 印度红 #cd5c5c
Indigo #4b0082 靛青 #4b0082
Ivory #fffff0 象牙 #fffff0
Khaki #f0e68c 卡其色 #f0e68c
Lavender #e6e6fa 薰衣草 #e6e6fa
LavenderBlush #fff0f5 淡紫 #fff0f5
LawnGreen #7cfc00 草坪绿 #7cfc00
LemonChiffon #fffacd 粉黄 #fffacd
LightBlue #add8e6 浅蓝 #add8e6
LightCoral #f08080 珊瑚色 #f08080
LightCyan #e0ffff 淡青色 #e0ffff
LightGoldenRodYellow #fafad2 浅金黄色 #fafad2
LightGreen #90ee90 浅绿色 #90ee90
LightGrey #d3d3d3 浅灰色 #d3d3d3
LightPink #ffb6c1 淡粉色 #ffb6c1
LightSalmon #ffa07a 橙红 #ffa07a
LightSeaGreen #20b2aa 光海绿 #20b2aa
LightSkyBlue #87cefa 淡天蓝 #87cefa
LightSlateGray #778899 浅灰色 #778899
LightSteelBlue #b0c4de 轻钢蓝 #b0c4de
LightYellow #ffffe0 淡黄色 #ffffe0
Lime #00ff00 酸橙 #00ff00
LimeGreen #32cd32 青柠 #32cd32
Linen #faf0e6 亚麻布 #faf0e6
Magenta #ff00ff 品红 #ff00ff
Maroon #800000 栗色 #800000
MediumAquaMarine #66cdaa 草绿 #66cdaa
MediumBlue #0000cd 暗蓝 #0000cd
MediumOrchid #ba55d3 暗兰花 #ba55d3
MediumPurple #9370d8 暗紫 #9370d8
MediumSeaGreen #3cb371 暗海藻 #3cb371
MediumSlateBlue #7b68ee 青蓝 #7b68ee
MediumSpringGreen #00fa9a 嫩绿 #00fa9a
MediumTurquoise #48d1cc 粉蓝 #48d1cc
MediumVioletRed #c71585 暗紫 #c71585
MidnightBlue #191970 黑蓝 #191970
MintCream #f5fffa 薄荷乳白 #f5fffa
MistyRose #ffe4e1 粉玫瑰红 #ffe4e1
Moccasin #ffe4b5 莫卡辛 #ffe4b5
NavajoWhite #ffdead 纳瓦霍白 #ffdead
Navy #000080 海军 #000080
OldLace #fdf5e6 旧布黄 #fdf5e6
Olive #808000 橄榄 #808000
OliveDrab #6b8e23 淡绿褐 #6b8e23
Orange #ffa500 橙色 #ffa500
OrangeRed #ff4500 橙红色 #ff4500
Orchid #da70d6 兰花 #da70d6
PaleGoldenRod #eee8aa 淡金黄 #eee8aa
PaleGreen #98fb98 浅绿色 #98fb98
PaleTurquoise #afeeee 淡蓝绿 #afeeee
PaleVioletRed #d87093 淡紫红色 #d87093
PapayaWhip #ffefd5 粉木瓜橙 #ffefd5
PeachPuff #ffdab9 粉桃红 #ffdab9
Peru #cd853f 秘鲁 #cd853f
Pink #ffc0cb 粉色的 #ffc0cb
Plum #dda0dd 李子 #dda0dd
PowderBlue #b0e0e6 粉蓝色 #b0e0e6
Purple #800080 紫色的 #800080
Red #ff0000 红色的 #ff0000
RosyBrown #bc8f8f 玫瑰褐 #bc8f8f
RoyalBlue #4169e1 宝蓝色 #4169e1
SaddleBrown #8b4513 马鞍棕 #8b4513
Salmon #fa8072 三文鱼 #fa8072
SandyBrown #f4a460 桑迪布朗 #f4a460
SeaGreen #2e8b57 海绿色 #2e8b57
SeaShell #fff5ee 贝壳 #fff5ee
Sienna #a0522d 赭色 #a0522d
Silver #c0c0c0 银色的 #c0c0c0
SkyBlue #87ceeb 天蓝色 #87ceeb
SlateBlue #6a5acd 青蓝 #6a5acd
SlateGray #708090 青灰 #708090
Snow #fffafa #fffafa
SpringGreen #00ff7f 嫩绿 #00ff7f
SteelBlue #4682b4 钢蓝 #4682b4
Tan #d2b48c 黄褐色 #d2b48c
Teal #008080 青色 #008080
Thistle #d8bfd8 #d8bfd8
Tomato #ff6347 番茄 #ff6347
Turquoise #40e0d0 绿松石 #40e0d0
Violet #ee82ee 紫罗兰 #ee82ee
Wheat #f5deb3 小麦 #f5deb3
White #ffffff 白色的 #ffffff
WhiteSmoke #f5f5f5 白色的烟 #f5f5f5
Yellow #ffff00 黄色的 #ffff00
YellowGreen #9acd32 黄绿色 #9acd32

2.8 Channel Layout 通道布局

通道布局指定多通道音频流中通道的空间布置。为了指定通道布局,FFmpeg 使用了一种特殊的语法。

2.8.1 各个频道由 id 标识,如下表所示:

NAME DESCRIPTION cn use
FL front left 左前 27
FR front right 右前 27
FC front center 前中 21
LFE low frequency 低频 12
BL back left 左后 11
BR back right 右后 11
FLC front left-of-center 前中左 6
FRC front right-of-center 前中右 6
BC back center 后中 10
SL side left 左侧 14
SR side right 右侧 14
TC top center 顶中心 1
TFL top front left 顶左前 2
TFC top front center 顶前中 2
TFR top front right 顶右前 2
TBL top back left 顶左后 2
TBC top back center 顶后中 2
TBR top back right 顶右后 2
TSL top side left 顶左侧 1
TSR top side right 顶右侧 1
DL downmix left 左缩混 1
DR downmix right 右缩混 1
WL wide left 宽左 1
WR wide right 宽右 1
SDL surround direct left 环绕左 0
SDR surround direct right 环绕右 0
LFE2 low frequency 2 低频2 1
BFC bottom front center 底前中 1
BFL bottom front left 底左前 1
BFR bottom front right 底右前 1

2.8.2 可以使用以下标识符指定标准通道布局组合:

NAME DECOMPOSITION channel FL FR FC LFE BL BR FLC FRC BC SL SR other Top/Bottom …
mono FC 1

FC









stereo FL+FR 2 FL FR










2.1 FL+FR+LFE 3 FL FR
LFE








3 FL+FR+FC 3 FL FR FC









3.0(back) FL+FR+BC 3 FL FR





BC



3.1 FL+FR+FC+LFE 4 FL FR FC LFE








4 FL+FR+FC+BC 4 FL FR FC




BC



quad FL+FR+BL+BR 4 FL FR

BL BR






quad(side) FL+FR+SL+SR 4 FL FR






SL SR

4.1 FL+FR+FC+LFE+BC 5 FL FR FC LFE



BC



5 FL+FR+FC+BL+BR 5 FL FR FC
BL BR






5.0(side) FL+FR+FC+SL+SR 5 FL FR FC





SL SR

5.1 FL+FR+FC+LFE+BL+BR 6 FL FR FC LFE BL BR






5.1(side) FL+FR+FC+LFE+SL+SR 6 FL FR FC LFE




SL SR

6 FL+FR+FC+BC+SL+SR 6 FL FR FC




BC SL SR

6.0(front) FL+FR+FLC+FRC+SL+SR 6 FL FR



FLC FRC
SL SR

hexagonal FL+FR+FC+BL+BR+BC 6 FL FR FC
BL BR

BC



6.1 FL+FR+FC+LFE+BC+SL+SR 7 FL FR FC LFE



BC SL SR

6.1(back) FL+FR+FC+LFE+BL+BR+BC 7 FL FR FC LFE BL BR

BC



6.1(front) FL+FR+LFE+FLC+FRC+SL+SR 7 FL FR
LFE

FLC FRC
SL SR

7 FL+FR+FC+BL+BR+SL+SR 7 FL FR FC
BL BR


SL SR

7.0(front) FL+FR+FC+FLC+FRC+SL+SR 7 FL FR FC


FLC FRC
SL SR

7.1 FL+FR+FC+LFE+BL+BR+SL+SR 8 FL FR FC LFE BL BR


SL SR

7.1(wide) FL+FR+FC+LFE+BL+BR+FLC+FRC 8 FL FR FC LFE BL BR FLC FRC




7.1(wide-side) FL+FR+FC+LFE+FLC+FRC+SL+SR 8 FL FR FC LFE

FLC FRC
SL SR

octagonal FL+FR+FC+BL+BR+BC+SL+SR 8 FL FR FC
BL BR

BC SL SR

hexadecagonal FL+FR+FC+BL+BR+BC+SL+SR+
TFL+TFC+TFR+TBL+TBC+TBR+WL+WR
16 FL FR FC
BL BR

BC SL SR WL;WR TFL;TFC;TFR;
TBL;TBC;TBR
downmix DL+DR 2










DL;DR
22.2 FL+FR+FC+LFE+BL+BR+FLC+FRC+BC+SL+SR+
TC+TFL+TFC+TFR+TBL+TBC+TBR+TSL+TSR+
LFE2+BFC+BFL+BFR
24 FL FR FC LFE BL BR FLC FRC BC SL SR LFE2 TC;TFL;TFC;TFR;TBL;
TBC;TBR;TSL;TSR
BFC;BFL;BFR

2.8.3 各频道id空间图示:


TFL


TFC


TFR

T
S
L







T
S
R





TC













TBL


TBC


TBR











S
D
L
FL W
L
FLC
FC
FRC W
R
FR S
D
R
S
L





S
R










BL

BC

BR












BFL


BFC


BFR












DL






DR






















2.8.4 自定义通道布局

自定义通道布局可以指定为一系列术语,以“+”或“|”分隔。每个术语可以是:
  • 标准通道布局的名称(e.g. ‘mono’, ‘stereo’, ‘4.0’, ‘quad’, ‘5.0’, etc.)
  • 单个频道的名称(e.g. ‘FL’, ‘FR’, ‘FC’, ‘LFE’, etc.)
  • 十进制数的通道数,后跟“c”,产生该通道数的默认通道布局(请参阅函数 av_get_default_channel_layout)。请注意,并非所有通道计数都有默认布局。
  • 十进制数的通道数,后跟“C”,产生具有指定通道数的未知通道布局。请注意,并非所有通道布局规范字符串都支持未知的通道布局。
  • 一个信道布局掩模mask,以十六进制开始以“0x”(见 AV_CH_*宏在libavutil/channel_layout.h.
在 libavutil 版本 53 之前,指定通道数的尾随字符“c”是可选的,但现在是必需的,而通道布局掩码也可以指定为十进制数(当且仅当后面没有“c”或“C”)。
另请参阅中av_get_channel_layout定义 的函数libavutil/channel_layout.h.

3. Expression Evaluation 表达式评估

在计算算术表达式时,FFmpeg 使用内部公式计算器,通过 libavutil/eval.h 界面。
表达式可能包含一元、二元运算符、常量和函数。
两个表达式expr1和expr2可以组合形成另一个表达式“ expr1 ; expr2 ”。 expr1和expr2依次求值,新表达式求值为expr2的值。
可以使用以下二元运算符:+, -, *, /, ^。
可以使用以下一元运算符:+, -.

3.1 functions

可以使用以下功能:
abs(x) Compute absolute value of x. 计算x 的绝对值。
acos(x) Compute arccosine of x. 计算x 的反余弦值。
sin(x) Compute arcsine of x. 计算x 的反正弦。
atan(x) Compute arctangent of x. 计算x 的反正切。
atan2(x, y) Compute principal value of the arc tangent of y/x. 计算y / x 的反正切的主值。
between(x, min, max) Return 1 if x is greater than or equal to min and lesser than or equal to max, 0 otherwise. 如果x大于或等于min且小于或等于max,则返回 1,否则返回0。
bitand(x, y) bitor(x, y) Compute bitwise and/or operation on x and y. 在x和y上计算按位和/或运算。
  x和y的计算结果在执行按位运算之前转换为整数。
  请注意,转换为整数和转换回浮点数都会失去精度。当心大数(通常为 2^53 及更大)的意外结果。
ceil(expr) Round the value of expression expr upwards to the nearest integer. For example, "ceil(1.5)" is "2.0". 将表达式expr的值向上舍入到最接近的整数。例如,“ceil(1.5)”是“2.0”。
clip(x, min, max) Return the value of x clipped between min and max. 返回裁剪在min和max之间的x值。
cos(x) Compute cosine of x. 计算x 的余弦。
cosh(x) Compute hyperbolic cosine of x. 计算x 的双曲余弦值。
eq(x, y) Return 1 if x and y are equivalent, 0 otherwise. 如果x和y相等,则返回 1 ,否则返回0。
exp(x) Compute exponential of x (with base e, the Euler’s number). 计算x 的指数(基数e为欧拉数)
floor(expr) Round the value of expression expr downwards to the nearest integer. For example, "floor(-1.5)" is "-2.0". 将表达式expr的值向下舍入到最接近的整数。例如,“地板(-1.5)”是“-2.0”。
gauss(x) Compute Gauss function of x, corresponding to exp(-x*x/2) / sqrt(2*PI). 计算x 的高斯函数,对应于 exp(-x*x/2) / sqrt(2*PI)。
gcd(x, y) Return the greatest common divisor of x and y. If both x and y are 0 or either or both are less than zero then behavior is undefined. 返回x和y 的最大公约数。如果x和 y均为 0 或其中一个或两者都小于零,则行为未定义。
gt(x, y) Return 1 if x is greater than y, 0 otherwise. 如果x大于y则返回 1 ,否则返回0。
gte(x, y) Return 1 if x is greater than or equal to y, 0 otherwise. 如果x大于或等于y则返回 1 ,否则返回0。
hypot(x, y) This function is similar to the C function with the same name; it returns "sqrt(x*x + y*y)", the length of the hypotenuse of a right triangle with sides of length x and y, or the distance of the point (x, y) from the origin. 这个函数类似于同名的C函数;它返回“sqrt( x * x + y * y )”,即边长为x和y的直角三角形斜边的长度,或点 ( x , y ) 与原点的距离。
if(x, y) Evaluate x, and if the result is non-zero return the result of the evaluation of y, return 0 otherwise. 计算x,如果结果非零,则返回y的计算结果,否则返回 0。
if(x, y, z) Evaluate x, and if the result is non-zero return the evaluation result of y, otherwise the evaluation result of z. 计算x,如果结果非零返回y 的计算结果,否则返回z 的计算结果。
ifnot(x, y) Evaluate x, and if the result is zero return the result of the evaluation of y, return 0 otherwise. 计算x,如果结果为零,则返回y的计算结果,否则返回 0。
ifnot(x, y, z) Evaluate x, and if the result is zero return the evaluation result of y, otherwise the evaluation result of z. 计算x,如果结果为零则返回y 的计算结果,否则返回z 的计算结果。
isinf(x) Return 1.0 if x is +/-INFINITY, 0.0 otherwise. 如果x是 +/-INFINITY,则返回 1.0 ,否则返回0.0。
isnan(x) Return 1.0 if x is NAN, 0.0 otherwise. 如果x是 NAN,则返回 1.0 ,否则返回0.0。
ld(var) Load the value of the internal variable with number var, which was previously stored with st(var, expr). The function returns the loaded value. 加载编号为var的内部变量的值,该值 之前是用 st( var , expr )存储的。该函数返回加载的值。
lerp(x, y, z) Return linear interpolation between x and y by amount of z. 按z的量返回x和y之间的线性插值。
log(x) Compute natural logarithm of x. 计算x 的自然对数。
lt(x, y) Return 1 if x is lesser than y, 0 otherwise. 如果x小于y则返回 1 ,否则返回0。
lte(x, y) Return 1 if x is lesser than or equal to y, 0 otherwise. 如果x小于或等于y,则返回 1 ,否则返回0。
max(x, y) Return the maximum between x and y. 返回x和y之间的最大值。
min(x, y) Return the minimum between x and y. 返回x和y之间的最小值。
mod(x, y) Compute the remainder of division of x by y. 计算x除以y的余数。
not(expr) Return 1.0 if expr is zero, 0.0 otherwise. 如果expr为零,则返回 1.0 ,否则返回0.0。
pow(x, y) Compute the power of x elevated y, it is equivalent to "(x)^(y)". 计算x提升y的幂,它等价于“( x )^( y )”。
print(t) print(t, l) Print the value of expression t with loglevel l. If l is not specified then a default log level is used. Returns the value of the expression printed. 使用日志级别l打印表达式t的值。如果 未指定l则使用默认日志级别。返回打印的表达式的值。Prints t with loglevel l
random(x) Return a pseudo random value between 0.0 and 1.0. x is the index of the internal variable which will be used to save the seed/state. 返回一个介于 0.0 和 1.0 之间的伪随机值。x是用于保存种子/状态的内部变量的索引。
root(expr, max) Find an input value for which the function represented by expr with argument ld(0) is 0 in the interval 0..max. 
  在区间 0.. max 中查找由expr表示的函数 和参数ld(0)为 0的输入值。
  expr中的表达式必须表示连续函数,否则结果未定义。
  ld(0)用于表示函数输入值,这意味着给定的表达式将使用表达式可以访问的各种输入值进行多次计算 ld(0)。当表达式的计算结果为 0 时,将返回相应的输入值。
round(expr) Round the value of expression expr to the nearest integer. For example, "round(1.5)" is "2.0". 将表达式expr的值四舍五入到最接近的整数。例如,“round(1.5)”是“2.0”。
sgn(x) Compute sign of x. 计算x 的符号。
sin(x) Compute sine of x. 计算x 的正弦值。
sinh(x) Compute hyperbolic sine of x. 计算x 的双曲正弦值。
sqrt(expr) Compute the square root of expr. This is equivalent to "(expr)^.5". 计算expr 的平方根。这相当于“( expr )^.5”。
squish(x) Compute expression 1/(1 + exp(4*x)). 计算表达式1/(1 + exp(4*x))。
st(var, expr) Store the value of the expression expr in an internal variable. var specifies the number of the variable where to store the value, and it is a value ranging from 0 to 9. The function returns the value stored in the internal variable. Note, Variables are currently not shared between expressions. 将表达式expr的值存储在内部变量中。var指定存储值的变量的编号,它是一个范围从 0 到 9 的值。该函数返回存储在内部变量中的值。请注意,变量当前不在表达式之间共享。
tan(x) Compute tangent of x. 计算x 的切线。
tanh(x) Compute hyperbolic tangent of x. 计算x 的双曲正切值。
taylor(expr, x) taylor(expr, x, id) Evaluate a Taylor series at x, given an expression representing the ld(id)-th derivative of a function at 0.
  计算x处的泰勒级数,给定一个表达式,表示ld(id)函数在 0 处的-th 导数。
  当级数不收敛时,结果是不确定的。
  ld(id)用于表示expr 中的导数顺序,这意味着给定的表达式将使用表达式可以访问的各种输入值进行多次计算 ld(id)。如果未指定id,则假定为 0。
  请注意,当您在 y 而不是 0 处有导数时, taylor(expr, x-y)可以使用。
time(0) Return the current (wallclock) time in seconds. 以秒为单位返回当前(挂钟)时间。
trunc(expr) Round the value of expression expr towards zero to the nearest integer. For example, "trunc(-1.5)" is "-1.0". 将表达式expr的值向零舍入到最接近的整数。例如,“trunc(-1​​.5)”是“-1.0”。
while(cond, expr) Evaluate expression expr while the expression cond is non-zero, and returns the value of the last expr evaluation, or NAN if cond was always false. 当表达式cond非零时计算表达式expr,并返回最后一次expr评估的值,如果cond始终为假,则返回NAN 。

3.2 constants 常数

The following constants are available: 以下常量可用:
PI area of the unit disc, approximately 3.14 圆周率
E exp(1) (Euler’s number), approximately 2.718 自然常数 欧拉数
PHI golden ratio (1+sqrt(5))/2, approximately 1.618 黄金比例
假设如果表达式具有非零值,则该表达式被视为“真”,请注意:
* 像 AND 一样工作
+ 像 OR 一样工作
例如构造: if (A AND B) then C  相当于: if(A*B, C)
在您的 C 代码中,您可以扩展一元和二元函数的列表,并定义可识别的常量,以便它们可用于您的表达式。
评估器还识别国际系统单位前缀。如果在前缀后附加“i”,则使用二进制前缀,其基于 1024 的幂而不是 1000 的幂。“B”后缀将值乘以 8,并且可以附加在单位前缀之后或单独使用. 这允许使用例如“KB”、“MiB”、“G”和“B”作为数字后缀。

3.3 International System prefixes 国际系统前缀

可用的国际系统前缀列表如下,并指示了 10 和 2 的相应幂。
y 10^-24 / 2^-80
z 10^-21 / 2^-70
a 10^-18 / 2^-60
f 10^-15 / 2^-50
p 10^-12 / 2^-40
n 10^-9 / 2^-30
u 10^-6 / 2^-20
m 10^-3 / 2^-10
c 10^-2
d 10^-1
h 10^2
k 10^3 / 2^10
K 10^3 / 2^10
M 10^6 / 2^20
G 10^9 / 2^30
T 10^12 / 2^40
P 10^15 / 2^40
E 10^18 / 2^50
Z 10^21 / 2^60
Y 10^24 / 2^70

Diode

导航 (返回顶部) 1. Diode 1.1 Diode 概述 1.2 肖克利二极管方程 1.3 缩写 Abbreviations 2. 主要功能 2.1 单向电流 (Unidirectional current flow) 2.2 阈值电压 (Threshold...