-
2021-08-07 10:56:42
FFMPEG对RTMP直播流转码,SRS在收到编码器推送的直播流后,可以对直播流进行转码,输出RTMP流到服务器(也可以到SRS自己)。
详细规则参考:FFMPEG,本文列出了具体的部署的实例。
假设服务器的IP是:192.168.1.170
第一步,获取SRS。详细参考GIT获取代码
git clone https://github.com/ossrs/srs
cd srs/trunk
或者使用git更新已有代码:
git pull
第二步,编译SRS。详细参考Build
./configure --with-ffmpeg && make
第三步,编写SRS配置文件。详细参考FFMPEG
将以下内容保存为文件,譬如conf/ffmpeg.transcode.conf,服务器启动时指定该配置文件(srs的conf文件夹有该文件)。
# conf/ffmpeg.transcode.conf
listen 1935;
max_connections 1000;
vhost __defaultVhost__ {
transcode {
enabled on;
ffmpeg ./objs/ffmpeg/bin/ffmpeg;
engine ff {
enabled on;
vfilter {
}
vcodec libx264;
vbitrate 500;
vfps 25;
vwidth 768;
vheight 320;
vthreads 12;
vprofile main;
vpreset medium;
vparams {
}
acodec libfdk_aac;
abitrate 70;
asample_rate 44100;
achannels 2;
aparams {
}
output rtmp://127.0.0.1:[port]/[app]?vhost=[vhost]/[stream]_[engine];
}
}
}
第四步,启动SRS。详细参考FFMPEG
./objs/srs -c conf/ffmpeg.conf
第五步,启动推流编码器。详细参考FFMPEG
使用FFMPEG命令推流:
for((;;)); do \
./objs/ffmpeg/bin/ffmpeg -re -i ./doc/source.200kbps.768x320.flv \
-vcodec copy -acodec copy \
-f flv -y rtmp://192.168.1.170/live/livestream; \
sleep 1; \
done
或使用FMLE推流:
FMS URL: rtmp://192.168.1.170/live
Stream: livestream
涉及的流包括:
编码器推送流:rtmp://192.168.1.170:1935/live/livestream
观看原始流:rtmp://192.168.1.170:1935/live/livestream
观看转码流:rtmp://192.168.1.170:1935/live/livestream_ff
第六步,观看RTMP流。详细参考FFMPEG
RTMP流地址为:rtmp://192.168.1.170/live/livestream
可以使用VLC观看。
或者使用在线SRS播放器播放:srs-player
备注:请将所有实例的IP地址192.168.1.170都换成部署的服务器IP地址。
第七步,观看FFMPEG转码的RTMP流。详细参考FFMPEG
RTMP流地址为:rtmp://192.168.1.170/live/livestream_ff
可以使用VLC观看。
或者使用在线SRS播放器播放:srs-player-ff
备注:请将所有实例的IP地址192.168.1.170都换成部署的服务器IP地址。
更多相关内容 -
ffmpeg中文文档
2019-06-13 19:13:35ffmpeg [global_options] {[input_file_options] -i input_url} ... {[output_file_options] output_url} ... 2描述 ffmpeg是一个非常快速的视频和音频转换器,也可以从现场音频/视频源中获取。它还可以在任意采样...1简介
ffmpeg [global_options] {[input_file_options] -i input_url} ... {[output_file_options] output_url} ...
2描述
ffmpeg是一个非常快速的视频和音频转换器,也可以从现场音频/视频源中获取。它还可以在任意采样率之间进行转换,并使用高质量的多相滤波器动态调整视频大小。ffmpeg从-i选项指定的任意数量的输入“文件”(可以是常规文件,管道,网络流,抓取设备等)读取,并写入任意数量的输出“文件”,由普通输出URL指定。命令行中找不到的任何无法解释为选项的内容都被视为输出URL。
原则上,每个输入或输出URL可以包含任何数量的不同类型的流(视频/音频/字幕/附件/数据)。允许的流的数量和/或类型可以受容器格式的限制。选择哪些输入将通过哪些输入自动完成或使用-map选项进行输出(请参阅流选择章节)。
要在选项中引用输入文件,必须使用它们的索引(从0开始)。例如。第一个输入文件是0,第二个是1,等等。类似地,文件中的流由它们的索引引用。例如。 2:3指的是第三个输入文件中的第四个流。另请参阅Stream说明符章节。
作为一般规则,选项将应用于下一个指定的文件。因此,顺序很重要,您可以在命令行上多次使用相同的选项。然后将每次出现应用于下一个输入或输出文件。此规则的例外是全局选项(例如详细级别),应首先指定。
不要混合输入和输出文件 - 首先指定所有输入文件,然后指定所有输出文件。也不要混合属于不同文件的选项。所有选项仅适用于下一个输入或输出文件,并在文件之间重置。
要将输出文件的视频比特率设置为64 kbit / s:
ffmpeg -i input.avi -b:v 64k -bufsize 64k output.avi
要强制输出文件的帧速率为24 fps:
ffmpeg -i input.avi -r 24 output.avi
要强制输入文件的帧速率(仅对原始格式有效)为1 fps,输出文件的帧速率为24 fps:
ffmpeg -r 1 -i input.m2v -r 24 output.avi
原始输入文件可能需要format选项。
3详细说明
ffmpeg中每个输出的转码过程可以通过下图描述:
_______ ______________ | | | | | input | demuxer | encoded data | decoder | file | ---------> | packets | -----+ |_______| |______________| | v _________ | | | decoded | | frames | |_________| ________ ______________ | | | | | | | output | <-------- | encoded data | <----+ | file | muxer | packets | encoder |________| |______________|
ffmpeg调用libavformat库(包含解复用器)来读取输入文件并从中获取包含编码数据的数据包。 当有多个输入文件时,ffmpeg会尝试通过跟踪任何活动输入流上的最低时间戳来保持它们的同步。
然后将编码的数据包传递给解码器(除非为流选择了流复制,进一步参见说明)。 解码器产生未压缩的帧(原始视频/ PCM音频/ ...),可以通过过滤进一步处理(参见下一节)。 在过滤之后,帧被传递到编码器,编码器对它们进行编码并输出编码的分组。 最后将这些传递给复用器,复用器将编码的数据包写入输出文件。
3.1过滤
在编码之前,ffmpeg可以使用libavfilter库中的过滤器处理原始音频和视频帧。 几个链式过滤器形成过滤器图形。 ffmpeg区分两种类型的filtergraph:简单和复杂。3.1.1简单滤波器图
简单的过滤器图是那些只有一个输入和输出的过滤器图,它们都是相同的类型。 在上图中,只需在解码和编码之间插入一个额外的步骤即可表示它们:_________ ______________ | | | | | decoded | | encoded data | | frames |\ _ | packets | |_________| \ /||______________| \ __________ / simple _\|| | / encoder filtergraph | filtered |/ | frames | |__________|
简单的过滤器图使用per-stream -filter选项配置(分别使用-vf和-af别名用于视频和音频)。 一个简单的视频过滤器图可以看起来像这样:
_______ _____________ _______ ________ | | | | | | | | | input | ---> | deinterlace | ---> | scale | ---> | output | |_______| |_____________| |_______| |________|
请注意,某些过滤器会更改帧属性但不会更改帧内容。 例如。 上例中的fps过滤器会更改帧数,但不会触及帧内容。 另一个例子是setpts过滤器,它只设置时间戳,否则不改变帧。
3.1.2复杂滤波器图
复杂滤波器图是那些不能简单地描述为应用于一个流的线性处理链的图。 例如,当图形具有多个输入和/或输出,或者输出流类型与输入不同时,就是这种情况。 它们可以用下图表示:_________ | | | input 0 |\ __________ |_________| \ | | \ _________ /| output 0 | \ | | / |__________| _________ \| complex | / | | | |/ | input 1 |---->| filter |\ |_________| | | \ __________ /| graph | \ | | / | | \| output 1 | _________ / |_________| |__________| | | / | input 2 |/ |_________|
复杂滤波器图使用-filter_complex选项配置。 请注意,此选项是全局的,因为复杂的过滤器图本质上不能明确地与单个流或文件关联。
-lavfi选项相当于-filter_complex。
复杂滤波器图的一个简单示例是覆盖滤波器,它具有两个视频输入和一个视频输出,其中一个视频覆盖在另一个之上。 它的音频对应物是amix过滤器。
3.2流复制
流复制是通过将复制参数提供给-codec选项而选择的模式。 它使ffmpeg省略了指定流的解码和编码步骤,因此它只进行解复用和多路复用。 它对于更改容器格式或修改容器级元数据很有用。 在这种情况下,上图将简化为:_______ ______________ ________ | | | | | | | input | demuxer | encoded data | muxer | output | | file | ---------> | packets | -------> | file | |_______| |______________| |________|
由于没有解码或编码,因此速度非常快,并且没有质量损失。但是,由于许多因素,它可能在某些情况下不起作用。应用过滤器显然也是不可能的,因为过滤器可以处理未压缩的数据。
4流选择
ffmpeg提供-map选项,用于手动控制每个输出文件中的流选择。用户可以跳过-map并让ffmpeg执行自动流选择,如下所述。 -vn / -an / -sn / -dn选项可用于分别跳过包含视频,音频,字幕和数据流,无论是手动映射还是自动选择,除了作为复杂滤波器图形输出的那些流。4.1描述
以下子部分描述了流选择中涉及的各种规则。接下来的示例显示了这些规则在实践中的应用方式。虽然我们尽一切努力准确地反映程序的行为,但FFmpeg正在不断发展,自撰写本文之后,代码可能已经发生了变化。
4.1.1自动选择流
在没有特定输出文件的任何映射选项的情况下,ffmpeg检查输出格式以检查可以包含哪种类型的流,即。视频,音频和/或字幕。对于每个可接受的流类型,ffmpeg将从所有输入中选择一个流(如果可用)。它将根据以下标准选择该流:
对于视频,它是具有最高分辨率的流,
对于音频,它是具有最多频道的流,
对于字幕,它是第一个找到的字幕流,但有一个警告。输出格式的默认字幕编码器可以是基于文本的,也可以是基于图像的,并且仅选择相同类型的字幕流。
在几个相同类型的流速率相等的情况下,选择具有最低索引的流。数据或附件流不会自动选择,只能使用-map包含在内。
4.1.2手动流选择
使用-map时,只有用户映射的流包含在该输出文件中,下面描述了filtergraph输出的一个可能的例外。4.1.3复杂滤波器图
如果有任何带有未标记焊盘的复杂滤波器输出流,它们将被添加到第一个输出文件中。如果输出格式不支持流类型,则会导致致命错误。如果没有map选项,则包含这些流会导致跳过其类型的自动流选择。如果存在地图选项,则除了映射的流之外还包括这些滤波器流。带有标记焊盘的复杂滤波器输出流必须一次映射一次。
4.1.4流处理
流处理与流选择无关,下面描述的字幕除外。流处理通过-codec选项设置,该选项针对特定输出文件中的流。特别是,在流选择过程之后,ffmpeg应用编解码器选项,因此不影响后者。如果没有为流类型指定-codec选项,ffmpeg将选择输出文件muxer注册的默认编码器。字幕存在例外。如果为输出文件指定了字幕编码器,则将包括找到任何类型,文本或图像的第一个字幕流。 ffmpeg不验证指定的编码器是否可以转换所选的流,或者转换的流是否在输出格式中是可接受的。这通常也适用:当用户手动设置编码器时,流选择过程不能检查编码流是否可以复用到输出文件中。如果不能,则ffmpeg将中止,并且所有输出文件都将无法处理。
4.2例子
以下示例说明了ffmpeg的流选择方法的行为,怪癖和限制。他们假设以下三个输入文件。
input file 'A.avi' stream 0: video 640x360 stream 1: audio 2 channels input file 'B.mp4' stream 0: video 1920x1080 stream 1: audio 2 channels stream 2: subtitles (text) stream 3: audio 5.1 channels stream 4: subtitles (text) input file 'C.mkv' stream 0: video 1280x720 stream 1: audio 2 channels stream 2: subtitles (image)
示例:自动流选择
ffmpeg -i A.avi -i B.mp4 out1.mkv out2.wav -map 1:a -c:a copy out3.mov
指定了三个输出文件,对于前两个,未设置-map选项,因此ffmpeg将自动为这两个文件选择流。
out1.mkv是一个Matroska容器文件,接受视频,音频和字幕流,因此ffmpeg将尝试选择每种类型中的一种。
对于视频,它将从B.mp4中选择stream 0,其在所有输入视频流中具有最高分辨率。
对于音频,它将从B.mp4中选择流stream 3,因为它具有最多的通道。
对于字幕,它将从B.mp4中选择流stream 2,这是A.avi和B.mp4中的第一个字幕流。out2.wav只接受音频流,因此只选择来自B.mp4的stream 3。
对于out3.mov,由于设置了-map选项,因此不会进行自动流选择。 -map 1:一个选项将从第二个输入B.mp4中选择所有音频流。此输出文件中不包含其他流。
对于前两个输出,将对所有包含的流进行转码。选择的编码器将是每种输出格式注册的默认编码器,可能与所选输入流的编解码器不匹配。
对于第三个输出,音频流的编解码器选项已设置为复制,因此不会发生或可能发生解码 - 过滤 - 编码操作。所选流的数据包应从输入文件传送,并在输出文件中复用。
示例:自动字幕选择
ffmpeg -i C.mkv out1.mkv -c:s dvdsub -an out2.mkv
尽管out1.mkv是Matroska容器文件,它接受字幕流,但只能选择视频和音频流。 C.mkv的字幕流是基于图像的,并且Matroska复用器的默认字幕编码器是基于文本的,因此字幕的转码操作预计会失败,因此不选择该流。 然而,在out2.mkv中,在命令中指定字幕编码器,因此,除了视频流之外,还选择字幕流。 -an的存在禁用out2.mkv的音频流选择。
示例:未标记的滤波器图输出
ffmpeg -i A.avi -i C.mkv -i B.mp4 -filter_complex "overlay" out1.mp4 out2.srt
此处使用-filter_complex选项设置过滤器图,该过滤器图由单个视频过滤器组成。 叠加滤波器只需要两个视频输入,但没有指定,因此使用前两个可用视频流,即A.avi和C.mkv。 过滤器的输出板没有标签,因此被发送到第一个输出文件out1.mp4。 因此,跳过自动选择视频流,这将选择B.mp4中的流。 大多数频道的音频流即。 自动选择B.mp4中的流3。 然而,没有选择字幕流,因为MP4格式没有注册默认字幕编码器,并且用户没有指定字幕编码器。
第二个输出文件out2.srt仅接受基于文本的字幕流。 因此,即使可用的第一个字幕流属于C.mkv,它也是基于图像的,因此被跳过。 所选择的流,B.mp4中的流2,是第一个基于文本的字幕流。
示例:标记的filtergraph输出
ffmpeg -i A.avi -i B.mp4 -i C.mkv -filter_complex "[1:v]hue=s=0[outv];overlay;aresample" \ -map '[outv]' -an out1.mp4 \ out2.mkv \ -map '[outv]' -map 1:a:0 out3.mkv
上面的命令将失败,因为标记为[outv]的输出焊盘已被映射两次。 不应处理任何输出文件。
ffmpeg -i A.avi -i B.mp4 -i C.mkv -filter_complex "[1:v]hue=s=0[outv];overlay;aresample" \ -an out1.mp4 \ out2.mkv \ -map 1:a:0 out3.mkv
上面的命令也会失败,因为色调过滤器输出有一个标签[out],并且没有被映射到任何地方。
该命令应修改如下,ffmpeg -i A.avi -i B.mp4 -i C.mkv -filter_complex "[1:v]hue=s=0,split=2[outv1][outv2];overlay;aresample" \ -map '[outv1]' -an out1.mp4 \ out2.mkv \ -map '[outv2]' -map 1:a:0 out3.mkv
来自B.mp4的视频流被发送到色调过滤器,其输出使用分割滤波器克隆一次,并且两个输出都标记为。然后将每个副本映射到第一个和第三个输出文件。
需要两个视频输入的覆盖滤波器使用前两个未使用的视频流。这些是来自A.avi和C.mkv的流。叠加输出未标记,因此无论是否存在-map选项,它都会被发送到第一个输出文件out1.mp4。
aresample过滤器发送第一个未使用的音频流,即A.avi的音频流。由于此过滤器输出也未标记,因此它也映射到第一个输出文件。 -an的存在仅抑制音频流的自动或手动流选择,而不抑制从滤波器图发送的输出。这两个映射流都应在out1.mp4中的映射流之前进行排序。
映射到out2.mkv的视频,音频和字幕流完全由自动流选择确定。
out3.mkv包含来自色调过滤器的克隆视频输出和来自B.mp4的第一个音频流。
5选项
如果没有另外指定,所有数字选项接受表示数字作为输入的字符串,其后可以跟随SI单位前缀之一,例如:'K','M'或'G'。如果将“i”附加到SI单位前缀,则完整前缀将被解释为二进制倍数的单位前缀,其基于1024的幂而不是1000的幂。将“B”附加到SI单位前缀乘以这允许使用例如:'KB','MiB','G'和'B'作为数字后缀。
不带参数的选项是布尔选项,并将相应的值设置为true。可以通过在选项名称前加上“no”来将它们设置为false。例如,使用“-nofoo”将名称为“foo”的布尔选项设置为false。
5.1流说明符
每个流应用一些选项,例如比特率或编解码器。流指定符用于精确指定给定选项所属的流。流说明符是通常附加到选项名称并通过冒号与其分隔的字符串。例如。 -codec:a:1 ac3包含a:1流说明符,匹配第二个音频流。因此,它将为第二音频流选择ac3编解码器。
流说明符可以匹配多个流,以便将选项应用于所有流。例如。 -b:a 128k匹配所有音频流。
空流说明符匹配所有流。例如,-codec copy或-codec: copy将复制所有流而无需重新编码。
流说明符的可能形式是:
stream_index
使用此索引匹配流。例如。 -threads:1 4将第二个流的线程数设置为4.如果stream_index用作附加流说明符(见下文),则它从匹配流中选择流编号stream_index。流编号基于libavformat检测到的流的顺序,除非还指定了程序ID。在这种情况下,它基于程序中流的排序。stream_type[:additional_stream_specifier]
stream_type是以下之一:视频为“v”或“V”,音频为“a”,副标题为“s”,数据为“d”,附件为“t”。 'v'匹配所有视频流,'V'仅匹配未附加图片,视频缩略图或封面艺术的视频流。如果使用additional_stream_specifier,则它匹配具有此类型并与additional_stream_specifier匹配的流。否则,它匹配指定类型的所有流。p:program_id[:additional_stream_specifier]
使用id program_id匹配程序中的流。如果使用additional_stream_specifier,则它匹配两个都是程序一部分并与additional_stream_specifier匹配的流。#stream_id or i:stream_id
通过流id匹配流(例如,MPEG-TS容器中的PID)。m:key[:value]
使用具有指定值的元数据标记键匹配流。如果未给出value,则将包含给定标记的流与任何值匹配。u
匹配具有可用配置的流,必须定义编解码器并且必须存在诸如视频维度或音频采样率之类的基本信息。请注意,在ffmpeg中,按元数据匹配仅适用于输入文件。
5.2通用选项
这些选项在ff *工具中共享。-L
显示许可证。-h, - ?, - help, - help [arg]
显示帮助。可以指定可选参数以打印关于特定项目的帮助。如果未指定参数,则仅显示基本(非高级)工具选项。arg的可能值是:
长
除基本工具选项外,还可以打印高级工具选项。充分
打印完整的选项列表,包括编码器,解码器,分路器,复用器,滤波器等的共享和专用选项。解码器= decoder_name
打印有关名为decoder_name的解码器的详细信息。使用-decoders选项获取所有解码器的列表。编码器= encoder_name
打印有关名为encoder_name的编码器的详细信息。使用-encoders选项获取所有编码器的列表。分路= demuxer_name
打印有关名为demuxer_name的分路器的详细信息。使用-formats选项获取所有解复用器和复用器的列表。复用器= muxer_name
打印有关名为muxer_name的muxer的详细信息。使用-formats选项获取所有复用器和分路器的列表。滤波器= FILTER_NAME
打印有关过滤器名称filter_name的详细信息。使用-filters选项获取所有过滤器的列表。-版
显示版本。- 格式
显示可用格式(包括设备)。-demuxers
显示可用的解复用器。-muxers
显示可用的复用器。-设备
显示可用设备。-codecs
显示libavcodec已知的所有编解码器。请注意,本文档中使用术语“编解码器”作为更正确称为媒体比特流格式的快捷方式。
-decoders
显示可用的解码器。-encoders
显示所有可用的编码器。-bsfs
显示可用的比特流过滤器。-protocols
显示可用协议。-filters
显示可用的libavfilter过滤器。-pix_fmts
显示可用的像素格式。-sample_fmts
显示可用的样本格式。-layouts
显示频道名称和标准频道布局。-colors
显示已识别的颜色名称-sources device [,opt1 = val1 [,opt2 = val2] ...]
显示输入设备的自动检测源。某些设备可能提供无法自动检测的系统相关源名称。不能假定返回的列表总是完整的。ffmpeg -sources pulse,server=192.168.0.4
-sinks device [,opt1 = val1 [,opt2 = val2] ...]
显示输出设备的自动检测接收器。 某些设备可能提供无法自动检测的与系统相关的接收器名称。 不能假定返回的列表总是完整的。ffmpeg -sinks pulse,server=192.168.0.4
-loglevel [flags +] loglevel | -v [flags +] loglevel
设置库使用的日志记录级别和标志。可选的标志前缀可以包含以下值:
'repeat'
表示重复的日志输出不应压缩到第一行,并且将省略“最后重复消息n次”行。'level'
表示日志输出应为每个消息行添加[level]前缀。这可以用作对数着色的替代方案,例如,将日志转储到文件时。标志也可以单独使用,添加'+'/' - '前缀来设置/重置单个标志,而不会影响其他标志或更改日志级别。设置flags和loglevel时,最后一个标志值和loglevel之间需要一个'+'分隔符。
loglevel是一个字符串或包含以下值之一的数字:
'quiet, -8'
什么都不显示;安静。'panic, 0'
仅显示可能导致进程崩溃的致命错误,例如断言失败。目前还没有用于任何目的。'fatal, 8'
只显示致命错误。这些是错误,在此之后该过程绝对无法继续。'error, 16'
显示所有错误,包括可以从中恢复的错误。'warning, 24'
显示所有警告和错误。将显示与可能不正确或意外事件相关的任何消息。'info, 32'
在处理过程中显示信息性消息。这是警告和错误的补充。这是默认值。'verbose, 40'
与信息相同,除了更详细。'debug, 48'
显示所有内容,包括调试信息。'trace, 56'
例如,要启用重复日志输出,请添加级别前缀,并将loglevel设置为verbose:ffmpeg -loglevel repeat+level+verbose -i input output
另一个允许重复日志输出而不影响级别前缀标志或loglevel的当前状态的示例:
ffmpeg [...] -loglevel +repeat
默认情况下,程序会记录到stderr。 如果终端支持着色,则使用颜色标记错误和警告。 可以禁用日志着色设置环境变量AV_LOG_FORCE_NOCOLOR或NO_COLOR,也可以强制设置环境变量AV_LOG_FORCE_COLOR。 不推荐使用环境变量NO_COLOR,将在以后的FFmpeg版本中删除。
-report
将完整命令行和控制台输出转储到当前目录中名为program-YYYYMMDD-HHMMSS.log的文件。 此文件可用于错误报告。 它还意味着-loglevel调试。将环境变量FFREPORT设置为任何值具有相同的效果。 如果值为':' - 分隔键=值序列,则这些选项将影响报告; 如果选项值包含特殊字符或选项分隔符':',则必须对其进行转义(请参阅ffmpeg-utils手册中的“引用和转义”部分)。
可识别以下选项:
file
设置用于报告的文件名; %p扩展为程序名称,%t扩展为时间戳,%%扩展为普通%level
使用数值设置日志详细级别(请参阅-loglevel)。例如,要使用日志级别32(日志级别信息的别名)将报告输出到名为ffreport.log的文件:
FFREPORT=file=ffreport.log:level=32 ffmpeg -i input output
解析环境变量时的错误不是致命的,并且不会出现在报告中。
-hide_banner
抑制打印横幅。所有FFmpeg工具通常都会显示版权声明,构建选项和库版本。 此选项可用于禁止打印此信息。
-cpuflags flags (global)
允许设置和清除cpu标志。 此选项用于测试。 除非你知道自己在做什么,否则不要使用它。ffmpeg -cpuflags -sse+mmx ... ffmpeg -cpuflags mmx ... ffmpeg -cpuflags 0 ...
此选项的可能的flag是:
'x86' 'mmx' 'mmxext' 'sse' 'sse2' 'sse2slow' 'sse3' 'sse3slow' 'ssse3' 'atom' 'sse4.1' 'sse4.2' 'avx' 'avx2' 'xop' 'fma3' 'fma4' '3dnow' '3dnowext' 'bmi1' 'bmi2' 'cmov' 'ARM' 'armv5te' 'armv6' 'armv6t2' 'vfp' 'vfpv3' 'neon' 'setend' 'AArch64' 'armv8' 'vfp' 'neon' 'PowerPC' 'altivec' 'Specific Processors' 'pentium2' 'pentium3' 'pentium4' 'k6' 'k62' 'athlon' 'athlonxp' 'k8'
5.3 AVOptions
这些选项由libavformat,libavdevice和libavcodec库直接提供。 要查看可用AVOptions列表,请使用-help选项。 它们分为两类:generic
可以为任何容器,编解码器或设备设置这些选项。 容器/设备的AVFormatContext选项和编解码器的AVCodecContext选项下列出了通用选项。private
这些选项特定于给定的容器,设备或编解码器。 私有选项列在其相应的容器/设备/编解码器下。例如,要将ID3v2.3标头而不是默认ID3v2.4写入MP3文件,请使用MP3 muxer的id3v2_version私有选项:
ffmpeg -i input.flac -id3v2_version 3 out.mp3
所有编解码器AVOptions都是每个流,因此应该附加一个流说明符:
ffmpeg -i multichannel.mxf -map 0:v:0 -map 0:a:0 -map 0:a:0 -c:a:0 ac3 -b:a:0 640k -ac:a:1 2 -c:a:1 aac -b:2 128k out.mp4
在上面的示例中,多声道音频流被映射两次以进行输出。 第一个实例用编解码器ac3和比特率640k编码。 将第二个实例缩混为2个通道,并使用编解码器aac进行编码。 使用输出流的绝对索引为其指定128k的比特率。
注意:-nooption语法不能用于布尔AVOptions,请使用-option 0 / -option 1。
注意:通过将v / a / s添加到选项名称之前指定每个流AVOptions的旧的未记录方式现在已过时,将很快删除。
5.4主要选择
-f fmt(输入/输出)
强制输入或输出文件格式。 通常会自动检测输入文件的格式,并从输出文件的文件扩展名中猜测,因此在大多数情况下不需要此选项。-i url(输入)
输入文件网址-y(glodal)
无需询问即可覆盖输出文件。-n(glodal)
不要覆盖输出文件,如果已存在指定的输出文件,请立即退出。-stream_loop号码(输入)
设置输入流的循环次数。 循环0表示无循环,循环-1表示无限循环。-c [:stream_specifier]编解码器(输入/输出,每个流)
-codec [:stream_specifier]编解码器(输入/输出,每个流)
为一个或多个流选择编码器(在输出文件之前使用时)或解码器(在输入文件之前使用时)。 codec是解码器/编码器的名称或特殊值副本(仅输出),表示不重新编码流。例如
ffmpeg -i INPUT -map 0 -c:v libx264 -c:a copy OUTPUT
使用libx264对所有视频流进行编码并复制所有音频流。
对于每个流,应用最后一个匹配的c选项,因此
ffmpeg -i INPUT -map 0 -c copy -c:v:1 libx264 -c:a:137 libvorbis OUTPUT
将复制除第二个视频(将使用libx264编码)和第138个音频(将使用libvorbis编码)之外的所有流。
-t duration(输入/输出)
当用作输入选项(在-i之前)时,限制从输入文件读取的数据的持续时间。当用作输出选项(在输出URL之前)时,在其持续时间达到持续时间后停止写入输出。
duration必须是持续时间规范,请参阅ffmpeg-utils(1)手册中的(ffmpeg-utils)持续时间部分。
-to和-t是互斥的,-t具有优先权。
-to position(输入/输出)
停止写入输出或读取位置输入。 position必须是持续时间规范,请参阅ffmpeg-utils(1)手册中的(ffmpeg-utils)持续时间部分。-to和-t是互斥的,-t具有优先权。
-fs limit_size(输出)
设置文件大小限制,以字节为单位。 超出限制后不再写入更多的字节块。 输出文件的大小略大于请求的文件大小。-ss position (输入/输出)
当用作输入选项(在-i之前)时,在此输入文件中寻找位置。 请注意,在大多数格式中,无法精确搜索,因此ffmpeg将在位置之前寻找最接近的搜索点。 当启用转码和-accurate_seek(默认值)时,搜索点和位置之间的这个额外段将被解码并丢弃。 在进行流复制时或使用-noaccurate_seek时,它将被保留。
当用作输出选项(在输出URL之前)时,解码但丢弃输入,直到时间戳到达位置。
position必须是持续时间规范,请参阅ffmpeg-utils(1)手册中的(ffmpeg-utils)持续时间部分。
-sseof position (输入)
与-ss选项类似,但相对于“文件结束”。 这是负值在文件中较早,0表示在EOF。
-itsoffset offset(输入)
设置输入时间偏移。offset必须是持续时间规范,请参阅ffmpeg-utils(1)手册中的(ffmpeg-utils)持续时间部分。
偏移量将添加到输入文件的时间戳中。指定正偏移意味着相应的流延迟了offset中指定的持续时间。
-itsscale scale(输入,每个流)
重新调整输入时间戳。 scale应该是一个浮点数。-timestamp date(输出)
在容器中设置录制时间戳。date必须是日期规范,请参阅ffmpeg-utils(1)手册中的(ffmpeg-utils)Date部分。
-metadata [:metadata_specifier] key = value(输出,每元数据)
设置元数据键/值对。可以给出可选的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
-disposition [:stream_specifier] value(输出,每个流)
设置流的处置。
此选项会覆盖从输入流复制的处置。 也可以通过将其设置为0来删除处置。
以下dispositions被认可:
default dub original comment lyrics karaoke 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。
-program [title=title:][program_num=program_num:]st=stream[:st=stream...] (输出)
创建具有指定标题program_num的程序,并将指定的流添加到该程序。
-target type (输出)
指定目标文件类型(vcd,svcd,dvd,dv,dv50)。 类型可以使用pal-,ntsc-或film-作为前缀,以使用相应的标准。 然后自动设置所有格式选项(比特率,编解码器,缓冲区大小)。 你可以输入:
ffmpeg -i myfile.avi -target vcd /tmp/vcd.mpg
但是,只要您知道它们与标准不冲突,您就可以指定其他选项,如:
ffmpeg -i myfile.avi -target vcd -bf 2 /tmp/vcd.mpg
-dn(输入/输出)
作为输入选项,阻止文件的所有数据流被过滤或自动选择或映射以用于任何输出。请参阅-discard选项以单独禁用流。作为输出选项,禁用数据记录,即自动选择或映射任何数据流。有关完全手动控制的信息,请参阅-map选项。
-dframes number(输出)
设置要输出的数据帧数。这是-frames:d的过时别名,您应该使用它。-frames [:stream_specifier] framecount(输出,每个流)
在framecount帧之后停止写入流。-q [:stream_specifier] q(输出,每个流)
-qscale [:stream_specifier] q(输出,每个流)
使用固定质量标度(VBR)。 q / qscale的含义取决于编解码器。如果在没有stream_specifier的情况下使用qscale,那么它仅适用于视频流,这是为了保持与先前行为的兼容性,并且为2个不同的编解码器指定相同的编解码器特定值,音频和视频通常不是没有stream_specifier时的意图用来。-filter [:stream_specifier] filtergraph(输出,每个流)
创建filtergraph指定的filtergraph并使用它来过滤流。filtergraph是要应用于流的filtergraph的描述,并且必须具有单个输入和相同类型的流的单个输出。在filtergraph中,输入与标签输入相关联,输出与标签输出相关联。有关filtergraph语法的详细信息,请参阅ffmpeg-filters手册。
如果要创建具有多个输入和/或输出的过滤器图形,请参阅-filter_complex选项。
-filter_script [:stream_specifier] filename(输出,每个流)
此选项类似于-filter,唯一的区别是它的参数是要从中读取过滤器图形描述的文件的名称。-filter_threads nb_threads(全局)
定义用于处理过滤器管道的线程数。每个管道都会产生一个线程池,这个线程可用于并行处理。默认值是可用CPU的数量。-pre [:stream_specifier] preset_name(输出,每个流)
指定匹配流的预设。-stats(全球)
打印编码进度/统计信息。默认情况下,要显式禁用它,您需要指定-nostats。-progress url(全局)
将程序友好的进度信息发送到url。大约每秒和编码过程结束时写入进度信息。它由“key = value”行组成。 key仅包含字母数字字符。一系列进度信息的最后一个键始终是“进度”。
-stdin
启用标准输入的交互。默认情况下启用,除非使用标准输入作为输入。要显式禁用交互,您需要指定-nostdin。禁用标准输入上的交互很有用,例如,如果ffmpeg位于后台进程组中。使用ffmpeg ... </ dev / null可以获得大致相同的结果,但它需要一个shell。
-debug_ts(全球)
打印时间戳信息。它默认是关闭的。此选项主要用于测试和调试,输出格式可能会从一个版本更改为另一个版本,因此便携式脚本不应使用它。另请参阅选项-fdebug ts。
-attach filename(输出)
将附件添加到输出文件。这有一些格式支持,如Matroska,例如用于渲染字幕的字体。附件是作为特定类型的流实现的,因此该选项将向文件添加新流。然后可以通常的方式在此流上使用每个流选项。使用此选项创建的附件流将在所有其他流(即使用-map或自动映射创建的流)之后创建。请注意,对于Matroska,您还必须设置mimetype元数据标记:
ffmpeg -i INPUT -attach DejaVuSans.ttf -metadata:s:2 mimetype=application/x-truetype-font out.mkv
(假设附件流将在输出文件中排在第三位)。
-dump_attachment [:stream_specifier] filename(输入,每个流)
将匹配的附件流提取到名为filename的文件中。 如果filename为空,则将使用文件名元数据标记的值。例如。 提取名为'out.ttf'的文件的第一个附件:
ffmpeg -dump_attachment:t:0 out.ttf -i INPUT
要提取由filename标记确定的文件的所有附件:
ffmpeg -dump_attachment:t "" -i INPUT
技术说明 - 附件是作为编解码器extradata实现的,因此该选项实际上可用于从任何流中提取extradata,而不仅仅是附件。
-noautorotate
禁用基于文件元数据自动旋转视频。5.5视频选项
-vframes number(输出)
设置要输出的视频帧数。这是-frames:v的过时别名,您应该使用它。-r [:stream_specifier] fps(输入/输出,每个流)
设置帧速率(Hz值,分数或缩写)。作为输入选项,忽略存储在文件中的任何时间戳,而是假设帧速率fps保持不变,生成时间戳。这与某些输入格式(如image2或v4l2)使用的-framerate选项不同(在旧版FFmpeg中它曾经是相同的)。如果有疑问,请使用-framerate而不是输入选项-r。
作为输出选项,复制或丢弃输入帧以实现恒定的输出帧速率fps。
-s [:stream_specifier] size(输入/输出,每个流)
设置框架大小。作为输入选项,这是video_size private选项的快捷方式,由一些分路器识别,其帧大小未存储在文件中或者是可配置的 - 例如,原始视频或视频采集卡。
作为输出选项,这会将scale视频滤镜插入相应滤镜图的末尾。请直接使用scale过滤器将其插入开头或其他位置。
格式为'wxh'(默认 - 与源相同)。
-aspect [:stream_specifier] aspect(输出,每个流)
设置由aspect指定的视频显示宽高比。aspect可以是浮点数字符串,也可以是num:den形式的字符串,其中num和den是宽高比的分子和分母。例如,“4:3”,“16:9”,“1.3333”和“1.7777”是有效的参数值。
如果与-vcodec副本一起使用,它将影响存储在容器级别的宽高比,但不会影响存储在编码帧中的宽高比(如果存在)。
-vn(输入/输出)
作为输入选项,阻止文件的所有视频流被过滤或自动选择或映射以用于任何输出。请参阅-discard选项以单独禁用流。作为输出选项,禁用视频记录,即自动选择或映射任何视频流。有关完全手动控制的信息,请参阅-map选项。
-vcodec codec(输出)
设置视频编解码器。这是-codec:v的别名。-pass [:stream_specifier] n(输出,每个流)
选择通行证号码(1或2)。它用于进行双通视频编码。视频的统计信息在第一次传递中记录到日志文件中(另请参见-passlog文件选项),在第二次传递中,该日志文件用于以精确请求的比特率生成视频。在第1阶段,您可能只是停用音频并将输出设置为null,Windows和Unix的示例:ffmpeg -i foo.mov -c:v libxvid -pass 1 -an -f rawvideo -y NUL ffmpeg -i foo.mov -c:v libxvid -pass 1 -an -f rawvideo -y /dev/null
-passlogfile [:stream_specifier] prefix(输出,每个流)
将两遍日志文件名前缀设置为前缀,默认文件名前缀为“ffmpeg2pass”。 完整的文件名将是PREFIX-N.log,其中N是特定于输出流的数字-vf filtergraph(输出)
创建filtergraph指定的filtergraph并使用它来过滤流。这是-filter:v的别名,请参阅-filter选项。
5.6高级视频选项
-pix_fmt [:stream_specifier] format(输入/输出,每个流)
设置像素格式。使用-pix_fmts显示所有支持的像素格式。如果无法选择所选的像素格式,ffmpeg将打印警告并选择编码器支持的最佳像素格式。如果pix_fmt以+为前缀,则如果无法选择所请求的像素格式,ffmpeg将退出并显示错误,并且禁用过滤器图形内的自动转换。如果pix_fmt是单个+,则ffmpeg选择与输入(或图形输出)相同的像素格式,并禁用自动转换。-sws_flags flags(输入/输出)
设置SwScaler标志。-rc_override [:stream_specifier] override(输出,每个流)
特定间隔的速率控制覆盖,格式为“int,int,int”列表,用斜杠分隔。两个第一个值是开始和结束帧数,最后一个是量化器,如果是正值则使用,或者质量因子,如果是负数。-ilme
强制编码器中的隔行扫描支持(仅限MPEG-2和MPEG-4)。如果您的输入文件是隔行扫描并且您希望保持隔行扫描格式以获得最小损失,请使用此选项。另一种方法是使用-deinterlace对输入流进行去隔行,但是去隔行会引入损失。-psnr
计算压缩帧的PSNR。-vstats
将视频编码统计信息转储到vstats_HHMMSS.log。-vstats_file文件
将视频编码统计转储到文件。-vstats_version文件
指定要使用的vstats格式的版本。默认值为2。version = 1:
frame =%5d q =%2.1f PSNR =%6.2f f_size =%6d s_size =%8.0fkB time =%0.3f br =%7.1fkbits / s avg_br =%7.1fkbits / s
版本> 1:
out =%2d st =%2d frame =%5d q =%2.1f PSNR =%6.2f f_size =%6d s_size =%8.0fkB time =%0.3f br =%7.1fkbits / s avg_br =%7.1fkbits / s
-top [:stream_specifier] n(输出,每个流)
top = 1 / bottom = 0 / auto = -1 field first-dc precision
Intra_dc_precision。-vtag fourcc / tag(输出)
强制视频标签/ fourcc。这是-tag:v的别名。-qphist(global)
显示QP直方图-vbsf bitstream_filter
不推荐见-bsf-force_key_frames [:stream_specifier] time [,time ...](输出,每个流)
-force_key_frames [:stream_specifier] expr:expr(输出,每个流)
在指定的时间戳强制关键帧,更准确地说是在每个指定时间后的第一帧。如果参数以expr:为前缀,则字符串expr将被解释为表达式,并针对每个帧进行求值。在评估为非零的情况下强制关键帧。
如果其中一个时间是“chapters[delta]”,则将其扩展到文件中所有章节开始的时间,移动增量,表示为以秒为单位的时间。此选项可用于确保在章节标记或输出文件中的任何其他指定位置存在搜索点。
例如,要在每个章节开始前的5分钟插入关键帧,加上关键帧0.1秒:
-force_key_frames 0:05:00,chapters-0.1
expr中的表达式可以包含以下常量:
n
当前处理帧的数量,从0开始n_forced
强制帧的数量prev_forced_n
前一个强制帧的编号,当没有强制关键帧时它是NANprev_forced_t
在前一个强制帧的时间,当没有强制关键帧时,它是NANt
当前处理帧的时间例如,要每5秒强制一个关键帧,您可以指定:
-force_key_frames expr:gte(t,n_forced*5)
要在最后一次强制时间后5秒强制关键帧,从13秒开始:
-force_key_frames expr:if(isnan(prev_forced_t),gte(t,13),gte(t,prev_forced_t+5))
请注意,强制使用太多关键帧对某些编码器的先行算法非常有害:使用固定GOP选项或类似选项会更有效。
-copyinkf [:stream_specifier](输出,每个流)
进行流复制时,还要复制开头找到的非关键帧。-init_hw_device type [= name] [:device [,key = value ...]]
使用给定的设备参数初始化名为name的类型类型的新硬件设备。如果未指定名称,则将收到“type%d”形式的默认名称。设备的含义和以下参数取决于设备类型:
cuda
device是CUDA设备的编号。dxva2
device是Direct3D 9显示适配器的编号。vaapi
device是X11显示名称或DRM渲染节点。如果未指定,它将尝试打开默认的X11显示($ DISPLAY),然后打开第一个DRM渲染节点(/ dev / dri / renderD128)。vdpau
device是X11显示名称。如果未指定,它将尝试打开默认的X11显示($ DISPLAY)。qsv
设备选择'MFX_IMPL_ *'中的值。允许的值是:auto
sw
hw
auto_any
hw_any
wh2
hw3
hw4
如果未指定,则使用“auto_any”。 (注意,通过创建适合平台的子设备('dxva2'或'vaapi')然后从中导出QSV设备,可能更容易实现QSV的预期结果。)opencl
设备选择平台和设备作为platform_index.device_index。还可以使用键值对来过滤该组设备,以仅查找与特定平台或设备字符串匹配的设备。
可用作过滤器的字符串是:
platform_profile
platform_version
platform_name
platform_vendor
platform_extensions
device_name
device_vendor
driver_version
device_version
device_profile
device_extensions
device_type索引和过滤器必须一起唯一地选择设备。
例子:
-init_hw_device opencl:0.1
在第一个平台上选择第二个设备。-init_hw_device opencl:,device_name = Foo9000
选择名称中包含字符串Foo9000的设备。-init_hw_device opencl:1,device_type = gpu,device_extensions = cl_khr_fp16
在支持cl_khr_fp16扩展的第二个平台上选择GPU设备。-init_hw_device type [= name] @source
初始化名为name的类型类型的新硬件设备,从名为source的现有设备派生它。-init_hw_device list
列出此ffmpeg版本中支持的所有硬件设备类型。-filter_hw_device name
将名为name的硬件设备传递给任何过滤器图形中的所有过滤器。这可用于设置要使用hwupload过滤器上传到的设备,或使用hwmap过滤器映射到的设备。其他过滤器在需要硬件设备时也可以使用此参数。请注意,这通常仅在输入尚未存在于硬件帧中时才需要 - 如果是,则过滤器将从它们作为输入接收的帧的上下文中获取它们所需的设备。这是一个全局设置,因此所有过滤器都将接收相同的设备。
-hwaccel [:stream_specifier] hwaccel(输入,每个流)
使用硬件加速来解码匹配的流。 hwaccel的允许值为:none
不要使用任何硬件加速(默认)。auto
自动选择硬件加速方法。vdpau
使用VDPAU(用于Unix的视频解码和Presentation API)硬件加速。dxva2
使用DXVA2(DirectX视频加速)硬件加速。vaapi
使用VAAPI(视频加速API)硬件加速。qsv
使用英特尔QuickSync视频加速进行视频转码。与大多数其他值不同,此选项不启用加速解码(仅在选择qsv解码器时自动使用),而是加速转码,而不将帧复制到系统内存中。
为使其工作,解码器和编码器都必须支持QSV加速,并且不得使用任何滤波器。
如果所选的hwaccel不可用或所选解码器不支持,则此选项无效。
请注意,大多数加速方法都是用于回放,并且不会比现代CPU上的软件解码更快。此外,ffmpeg通常需要将解码后的帧从GPU内存复制到系统内存中,从而导致性能进一步下降。因此,该选项主要用于测试。
-hwaccel_device [:stream_specifier] hwaccel_device(输入,每个流)
选择要用于硬件加速的设备。仅当指定了-hwaccel选项时,此选项才有意义。它可以引用通过名称使用-init_hw_device创建的现有设备,也可以创建新设备,就像'-init_hw_device'类型:hwaccel_device之前被调用一样。
-hwaccels
列出此ffmpeg构建中支持的所有硬件加速方法。5.7音频选项
-frames number(输出)
设置要输出的音频帧数。这是-frames:a的过时别名,您应该使用它。-ar [:stream_specifier] freq(输入/输出,每个流)
设置音频采样频率。对于输出流,默认情况下将其设置为相应输入流的频率。对于输入流,此选项仅对音频抓取设备和原始分路器有意义,并映射到相应的分路器选项。-qq q(输出)
设置音频质量(特定于编解码器,VBR)。这是-q:a的别名。-ac [:stream_specifier]通道(输入/输出,每个流)
设置音频通道的数量。对于输出流,默认设置为输入音频通道的数量。对于输入流,此选项仅对音频抓取设备和原始分路器有意义,并映射到相应的分路器选项。-an(输入/输出)
作为输入选项,阻止文件的所有音频流被过滤或自动选择或映射以用于任何输出。请参阅-discard选项以单独禁用流。作为输出选项,禁用音频记录,即自动选择或映射任何音频流。有关完全手动控制的信息,请参阅-map选项。
-acodec编解码器(输入/输出)
设置音频编解码器。这是-codec的别名:a。-sample_fmt [:stream_specifier] sample_fmt(输出,每个流)
设置音频样本格式。使用-sample_fmts获取支持的样本格式列表。-af filtergraph(输出)
创建filtergraph指定的filtergraph并使用它来过滤流。这是-filter:a的别名,请参阅-filter选项。
5.8高级音频选项
-atag fourcc / tag(输出)
强制音频标签/ fourcc。 这是-tag:a的别名。-absf bitstream_filter
不推荐使用,请参阅-bsf-guess_layout_max channels(输入,每个流)
如果某些输入通道布局未知,请尝试仅猜测它是否对应于最多指定数量的通道。 例如,2告诉ffmpeg将1声道识别为单声道,将2声道识别为立体声而不是6声道识别为5.1。 默认是总是试图猜测。 使用0禁用所有猜测。5.9字幕选项
-scodec编解码器(输入/输出)
设置字幕编解码器。 这是-codec:s的别名。-sn(输入/输出)
作为输入选项,阻止文件的所有字幕流被过滤或自动选择或映射以用于任何输出。 请参阅-discard选项以单独禁用流。作为输出选项,禁用字幕记录,即自动选择或映射任何字幕流。 有关完全手动控制的信息,请参阅-map选项。
-sbsf bitstream_filter
不推荐使用,请参阅-bsf5.10高级字幕选项
-fix_sub_duration
修复字幕持续时间。 对于每个字幕,等待同一流中的下一个数据包并调整第一个数据包的持续时间以避免重叠。 对于一些字幕编解码器,尤其是DVB字幕,这是必要的,因为原始分组中的持续时间仅是粗略估计,并且结尾实际上由空字幕帧标记。 必要时未能使用此选项会导致由于非单调时间戳而导致的夸大持续时间或多路复用失败。请注意,此选项将延迟所有数据的输出,直到下一个字幕包被解码:它可能会大量增加内存消耗和延迟。
-canvas_size大小
设置用于渲染字幕的画布大小。5.11高级选项
-map [ - ] input_file_id [:stream_specifier] [?] [,sync_file_id [:stream_specifier]] | [linklabel](输出)
将一个或多个输入流指定为输出文件的源。每个输入流由输入文件索引input_file_id和输入文件中的输入流索引input_stream_id标识。两个索引都从0开始。如果指定,sync_file_id:stream_specifier设置哪个输入流用作表示同步参考。命令行中的第一个-map选项指定输出流0的源,第二个-map选项指定输出流1的源,等等。
- 流标识符之前的字符创建“negative”映射。它禁用已创建映射的匹配流。
尾随的"?"在流索引之后将允许地图是可选的:如果地图不匹配流,则将忽略地图而不是失败。请注意,如果使用无效的输入文件索引,映射仍将失败;例如,如果地图指的是不存在的输入。
另一种[linklabel]表单将把复杂过滤器图形的输出(请参阅-filter_complex选项)映射到输出文件。 linklabel必须对应于图中定义的输出链接标签。
例如,将所有流从第一个输入文件映射到输出
ffmpeg -i INPUT -map 0 output
例如,如果第一个输入文件中有两个音频流,则这些流由“0:0”和“0:1”标识。 您可以使用-map选择要放在输出文件中的流。 例如:
ffmpeg -i INPUT -map 0:1 out.wav
将由“0:1”标识的INPUT中的输入流映射到out.wav中的(单个)输出流。
例如,要从输入文件a.mov(由标识符“0:2”指定)中选择索引为2的流,并从输入b.mov(由标识符“1:6”指定)中选择索引为6的流, 并将它们复制到输出文件out.mov:
ffmpeg -i a.mov -i b.mov -c copy -map 0:2 -map 1:6 out.mov
要从输入文件中选择所有视频和第三个音频流:
ffmpeg -i INPUT -map 0:v -map 0:a:2 OUTPUT
要映射除第二个音频之外的所有流,请使 negative映射
ffmpeg -i INPUT -map 0 -map -0:a:1 OUTPUT
要映射来自第一个输入的视频和音频流,并使用尾随?,如果第一个输入中没有音频流,则忽略音频映射:
ffmpeg -i INPUT -map 0:v -map 0:a? OUTPUT
要选择英语音频流:
ffmpeg -i INPUT -map 0:m:language:eng OUTPUT
请注意,使用此选项会禁用此输出文件的默认映射。
-ignore_unknown
如果尝试复制此类流,则忽略具有未知类型的输入流而不是失败。-copy_unknown
如果尝试复制此类流,则允许复制具有未知类型的输入流而不是失败。-map_channel [input_file_id.stream_specifier.channel_id | -1] [?] [:output_file_id.stream_specifier]
将音频通道从给定输入映射到输出。 如果未设置output_file_id.stream_specifier,则音频通道将映射到所有音频流。使用“-1”而不是input_file_id.stream_specifier.channel_id将映射静音通道。
尾随?将允许map_channel是可选的:如果map_channel不匹配任何通道,则将忽略map_channel而不是失败。
例如,假设INPUT是立体声音频文件,您可以使用以下命令切换两个音频通道:
ffmpeg -i INPUT -map_channel 0.0.1 -map_channel 0.0.0 OUTPUT
如果你想静音第一个频道并保持第二个频道:
ffmpeg -i INPUT -map_channel -1 -map_channel 0.0.1 OUTPUT
“-map_channel”选项的顺序指定输出流中通道的顺序。 输出通道布局是从映射的通道数量中猜出的(单声道,如果一个“-map_channel”,立体声,如果是两个,等等)。 如果输入和输出通道布局不匹配,则使用“-ac”组合“-map_channel”可以更新通道增益级别(例如两个“-map_channel”选项和“-ac 6”)。
您还可以将输入的每个通道提取到特定输出; 以下命令将INPUT音频流(file0,stream0)的两个通道提取到相应的OUTPUT_CH0和OUTPUT_CH1输出:
ffmpeg -i INPUT -map_channel 0.0.0 OUTPUT_CH0 -map_channel 0.0.1 OUTPUT_CH1
以下示例将立体声输入的通道拆分为两个单独的流,这些流被放入相同的输出文件中:
ffmpeg -i stereo.wav -map 0:0 -map 0:0 -map_channel 0.0.0:0.0 -map_channel 0.0.1:0.1 -y out.ogg
请注意,目前每个输出流只能包含来自单个输入流的通道; 例如,您不能使用“-map_channel”来选择包含在不同流(来自相同或不同文件)中的多个输入音频通道,并将它们合并为单个输出流。 因此,例如,当前不可能将两个单独的单声道流转换成单个立体声流。 然而,将立体声流分成两个单声道单声道流是可能的。
如果您需要此功能,可能的解决方法是使用amerge过滤器。 例如,如果您需要将媒体(此处为input.mkv)与2个单声道音频流合并为一个立体声通道音频流(并保留视频流),则可以使用以下命令:
ffmpeg -i input.mkv -filter_complex "[0:1] [0:2] amerge" -c:a pcm_s16le -c:v copy output.mkv
要从第一个输入映射前两个音频通道,并使用尾随?,如果第一个输入是单声道而不是立体声,请忽略音频通道映射:
ffmpeg -i INPUT -map_channel 0.0.0 -map_channel 0.0.1? OUTPUT
-map_metadata [:metadata_spec_out] infile [:metadata_spec_in](输出,每元数据)
从infile设置下一个输出文件的元数据信息。 请注意,这些是文件索引(从零开始),而不是文件名。 可选的metadata_spec_in / out参数指定要复制的元数据。 元数据说明符可以具有以下形式:g
全局元数据,即应用于整个文件的元数据s [:stream_spec]
每个流元数据。 stream_spec是Stream说明符章节中描述的流说明符。 在输入元数据说明符中,复制第一个匹配流。 在输出元数据说明符中,将所有匹配的流复制到。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在此示例中也可以正常工作,因为默认情况下采用全局元数据。
-map_chapters input_file_index(输出)
将带有索引input_file_index的输入文件中的章节复制到下一个输出文件。如果未指定章节映射,则从第一个输入文件复制章节,至少有一章。使用负文件索引禁用任何章节复制。-benchmark(全局)
在编码结束时显示基准信息。显示实际使用的系统和用户时间以及最大内存消耗。所有系统都不支持最大内存消耗,如果不支持,通常会显示为0。-benchmark_all(全局)
在编码期间显示基准信息。显示在各个步骤中使用的实际,系统和用户时间(音频/视频编码/解码)。-timelimit duration(全局)
ffmpeg运行持续时间秒后退出。-dump(全局)
将每个输入数据包转储到stderr。-hex(全局)
转储数据包时,也会转储有效负载。-re(输入)
以本机帧速率读取输入。主要用于模拟抓取设备或实时输入流(例如,从文件读取时)。不应与实际的抓取设备或实时输入流一起使用(它可能导致数据包丢失)。默认情况下,ffmpeg尝试尽可能快地读取输入。此选项将减慢输入读取到输入的本机帧速率。它对于实时输出(例如直播)很有用。-vsync参数
视频同步方法。出于兼容性原因,旧值可以指定为数字。必须始终将新添加的值指定为字符串。0,passthrough
每个帧都以其从分路器到复用器的时间戳传递。1,cfr
将复制和删除帧以实现所要求的恒定帧速率。2,vfr
帧以其时间戳传递或丢弃,以防止2帧具有相同的时间戳。drop
作为passthrough但是会破坏所有时间戳,使muxer根据帧速率生成新的时间戳。-1,auto
根据复用器功能选择1到2之间。这是默认方法。注意,在此之后,复用器可以进一步修改时间戳。 例如,在启用格式选项avoid_negative_ts的情况下。
使用-map,您可以选择应从哪个流中获取时间戳。 您可以保持视频或音频不变,并将剩余的流同步到未更改的流。
-frame_drop_threshold parameter
帧丢弃阈值,指定视频帧在丢弃之前可以有多少。在帧速率单位中,1.0是一帧。默认值为-1.1。一个可能的用例是在出现噪声时间戳的情况下避免使用framedrops,或者在精确时间戳的情况下提高帧丢弃精度。-async samples_per_second
音频同步方法。 “拉伸/挤压”音频流以匹配时间戳,参数是音频更改的每秒最大采样数。 -async 1是一种特殊情况,其中仅校正音频流的开始而不进行任何后续校正。注意,在此之后,复用器可以进一步修改时间戳。例如,在启用格式选项avoid_negative_ts的情况下。
此选项已被弃用。请改用aresample音频过滤器。
-copyts
不处理输入时间戳,但保留其值而不尝试清理它们。特别是,不要删除初始启动时间偏移值。请注意,根据vsync选项或特定的多路复用器处理(例如,如果启用了格式选项avoid_negative_ts),即使选择此选项,输出时间戳也可能与输入时间戳不匹配。
-start_at_zero
与copyts一起使用时,移位输入时间戳,使它们从零开始。这意味着使用例如-ss 50将使输出时间戳从50秒开始,无论输入文件的起始时间戳是什么。
-copytb mode
指定在流复制时如何设置编码器时基。 mode是一个整数数值,可以采用以下值之一:1
使用分路器时基。时基从相应的输入分路器复制到输出编码器。当复制具有可变帧速率的视频流时,有时需要避免非单调增加时间戳。
0
使用解码器时基。时基从相应的输入解码器复制到输出编码器。
-1
尝试自动进行选择,以生成合理的输出。默认值为-1。
-enc_time_base [:stream_specifier] timebase(输出,每个流)
设置编码器时基。 timebase是一个浮点数,可以采用以下值之一:0
根据媒体类型分配默认值。对于视频 - 使用1 /帧速率,用于音频 - 使用1 / samplerate。
-1
尽可能使用输入流时基。如果输入流不可用,将使用默认时基。
>0
使用提供的数字作为时基。该字段可以作为两个整数的比率(例如1:24,1:48000)或浮点数(例如0.04166,2.0833e-5)提供。
默认值为0。
-bitexact(输入/输出)
为(de)muxer和(de / en)编码器启用bitexact模式-shortest(输出)
最短输入流结束时完成编码。-dts_delta_threshold
时间戳不连续性增量阈值。-muxdelay秒(输出)
设置最大解复用 - 解码延迟。-muxpreload seconds(输出)
设置初始demux-decode延迟。-streamid output-stream-index:new-value(output)
将新的stream-id值分配给输出流。 应在其应用的输出文件名之前指定此选项。 对于存在多个输出文件的情况,可以将streamid重新分配给不同的值。例如,要将输出mpegts文件的流0 PID设置为33,将流1 PID设置为36:
ffmpeg -i inurl -streamid 0:33 -streamid 1:36 out.ts
-bsf [:stream_specifier] bitstream_filters(输出,每个流)
设置用于匹配流的比特流过滤器。 bitstream_filters是逗号分隔的比特流过滤器列表。 使用-bsfs选项获取比特流过滤器列表。ffmpeg -i h264.mp4 -c:v copy -bsf:v h264_mp4toannexb -an out.h264
ffmpeg -i file.mov -an -vn -bsf:s mov2textsub -c:s copy -f rawvideo sub.txt
-tag [:stream_specifier] codec_tag(输入/输出,每个流)
强制标记/ fourcc用于匹配流。-timecode hh:mm:ssSEPff
指定写入的时间码。 对于非丢弃时间码,SEP为':',对于丢弃,SEP为';'(或'.')。ffmpeg -i input.mpg -timecode 01:02:03.04 -r 30000/1001 -s ntsc output.mpg
-filter_complex filtergraph(全局)
定义复杂的滤波器图形,即具有任意数量的输入和/或输出的滤波器图形。 对于简单图形 - 具有一个输入和一个相同类型的输出的图形 - 请参阅-filter选项。 filtergraph是filtergraph的描述,如ffmpeg-filters手册的“Filtergraph语法”部分所述。输入链接标签必须使用[file_index:stream_specifier]语法引用输入流(即与-map使用相同)。 如果stream_specifier匹配多个流,则将使用第一个流。 未标记的输入将连接到匹配类型的第一个未使用的输入流。
输出链接标签用-map引用。 未标记的输出将添加到第一个输出文件中。
请注意,使用此选项,可以仅使用没有普通输入文件的lavfi源。
例如,在视频上叠加图像
ffmpeg -i video.mkv -i image.png -filter_complex '[0:v][1:v]overlay[out]' -map '[out]' out.mkv
这里[0:v]指的是第一个输入文件中的第一个视频流,它链接到覆盖滤波器的第一个(主)输入。 类似地,第二输入中的第一视频流链接到覆盖的第二(覆盖)输入。
假设每个输入文件中只有一个视频流,我们可以省略输入标签,所以上面相当于
ffmpeg -i video.mkv -i image.png -filter_complex 'overlay[out]' -map '[out]' out.mkv
此外,我们可以省略输出标签,过滤器图形的单个输出将自动添加到输出文件中,因此我们可以简单地写
ffmpeg -i video.mkv -i image.png -filter_complex 'overlay' out.mkv
使用lavfi颜色源生成5秒纯红色视频:
ffmpeg -filter_complex 'color=c=red' -t 5 out.mkv
-filter_complex_threads nb_threads(全局)
定义用于处理filter_complex图的线程数。与filter_threads类似,但仅用于-filter_complex图。默认值是可用CPU的数量。-lavfi filtergraph(全局)
定义复杂的滤波器图形,即具有任意数量的输入和/或输出的滤波器图形。相当于-filter_complex。-filter_complex_script filename(全局)
此选项类似于-filter_complex,唯一的区别是它的参数是要从中读取复杂filtergraph描述的文件的名称。-accurate_seek(输入)
此选项使用-ss选项启用或禁用输入文件中的准确搜索。它默认启用,因此在转码时搜索是准确的。使用-noaccurate_seek来禁用它,这可能是有用的,例如复制某些流并转码其他流时。-seek_timestamp(输入)
此选项使用-ss选项启用或禁用输入文件中的时间戳搜索。默认情况下禁用它。如果启用,则-ss选项的参数将被视为实际时间戳,并且不会被文件的开始时间偏移。这仅适用于不是从时间戳0开始的文件,例如传输流。-thread_queue_size大小(输入)
此选项设置从文件或设备读取时排队的最大数据包数。对于低延迟/高速率直播流,如果不及时读取数据包,则可以丢弃数据包;提高这个价值可以避免它。-sdp_file文件(全局)
将输出流的sdp信息打印到文件。这允许在至少一个输出不是rtp流时转储sdp信息。 (要求至少一种输出格式为rtp)。-discard(输入)
允许从流中丢弃特定的流或帧。任何输入流都可以使用全部值完全丢弃,而来自流的帧的选择性丢弃在解复用器处发生,并且不被所有解复用器支持。none
不丢弃任何帧。default
默认值,不丢弃任何帧。noref
丢弃所有非参考帧。bidir
丢弃所有双向帧。nokey
丢弃除关键帧之外的所有帧。all
丢弃所有帧。-abort_on标志(全局)
在各种条件下停止并中止。可以使用以下标志:empty_output
没有数据包传递给多路复用器,输出为空。-xerror(全局)
出错时停止并退出-max_muxing_queue_size packets(输出,每个流)
当转码音频和/或视频流时,ffmpeg将不会开始写入输出,直到它为每个这样的流有一个数据包。在等待这种情况发生时,其他流的数据包将被缓冲。此选项为数据包中的匹配输出流设置此缓冲区的大小。对于大多数用途,此选项的默认值应足够高,因此如果您确定需要,请仅触摸此选项。
作为特殊例外,您可以使用位图字幕流作为输入:它将转换为与文件中最大视频大小相同的视频,如果没有视频则转换为720x576。请注意,这是一个实验性的临时解决方案。一旦libavfilter对字幕有适当的支持,它将被删除。
例如,要在以MPEG-TS格式存储的DVB-T录制之上对字幕进行硬编码,将字幕延迟1秒:
ffmpeg -i input.ts -filter_complex \ '[#0x2ef] setpts=PTS+1/TB [sub] ; [#0x2d0] [sub] overlay' \ -sn -map '#0x2dc' output.mkv
(0x2d0,0x2dc和0x2ef分别是视频,音频和字幕流的MPEG-TS PID; 0:0,0:3和0:7也可以工作)
5.12预设文件
预设文件包含一系列option = value对,每行一个,指定在命令行上难以指定的选项序列。 以哈希('#')字符开头的行将被忽略,并用于提供注释。 检查FFmpeg源代码树中的预置目录以获取示例。
有两种类型的预设文件:ffpreset和avpreset文件。
5.12.1 ffpreset文件
ffpreset文件使用vpre,apre,spre和fpre选项指定。 fpre选项使用预设的文件名而不是预设名称作为输入,可用于任何类型的编解码器。对于vpre,apre和spre选项,预设文件中指定的选项将应用于当前所选的与预设选项相同类型的编解码器。
传递给vpre,apre和spre预设选项的参数根据以下规则标识要使用的预设文件:
首先,ffmpeg在$FFMPEG_DATADIR(如果设置)和$HOME / .ffmpeg目录中搜索名为arg.ffpreset的文件,并在配置时定义的datadir(通常为PREFIX/share/ ffmpeg)或沿ffpresets文件夹中搜索按顺序在win32上执行。例如,如果参数是libvpx-1080p,它将搜索文件libvpx-1080p.ffpreset。
如果未找到此类文件,则ffmpeg将在上述目录中搜索名为codec_name-arg.ffpreset的文件,其中codec_name是将应用预设文件选项的编解码器的名称。例如,如果您使用-vcodec libvpx选择视频编解码器并使用-vpre 1080p,那么它将搜索文件libvpx-1080p.ffpreset。
5.12.2 avpreset文件
avpreset文件使用pre选项指定。 它们的工作方式类似于ffpreset文件,但它们只允许特定于编码器的选项。 因此,不能使用指定编码器的选项=值对。
当指定pre选项时,ffmpeg将在目录$AVCONV_DATADIR(如果设置)和$HOME/ .avconv中查找带有后缀.avpreset的文件,并在配置时定义的datadir中查找(通常为PREFIX / share / ffmpeg) , 以该顺序。
首先,ffmpeg在上述目录中搜索名为codec_name-arg.avpreset的文件,其中codec_name是将应用预设文件选项的编解码器的名称。 例如,如果您使用-vcodec libvpx选择视频编解码器并使用-pre 1080p,那么它将搜索文件libvpx-1080p.avpreset。
如果未找到此类文件,则ffmpeg将在相同目录中搜索名为arg.avpreset的文件。
6 例子
6.1视频和音频抓取
如果您指定输入格式和设备,则ffmpeg可以直接获取视频和音频。
ffmpeg -f oss -i /dev/dsp -f video4linux2 -i /dev/video0 /tmp/out.mpg
或者使用ALSA音频源(单声道输入,卡ID 1)而不是OSS:
ffmpeg -f alsa -ac 1 -i hw:1 -f video4linux2 -i /dev/video0 /tmp/out.mpg
请注意,在使用任何电视查看器(例如Gerd Knorr的xawtv)启动ffmpeg之前,您必须激活正确的视频源和频道。 您还必须使用标准混音器正确设置音频录制电平。
6.2 X11抓取
用ffmpeg via抓取X11显示器
ffmpeg -f x11grab -video_size cif -framerate 25 -i :0.0 /tmp/out.mpg
0.0是X11服务器的display.screen number,与DISPLAY环境变量相同。
ffmpeg -f x11grab -video_size cif -framerate 25 -i :0.0+10,20 /tmp/out.mpg
0.0是X11服务器的display.screen number,与DISPLAY环境变量相同。 10是x偏移,20是y偏移,用于抓取。
6.3视频和音频文件格式转换
任何支持的文件格式和协议都可以作为ffmpeg的输入:
例子:
您可以使用YUV文件作为输入:
ffmpeg -i /tmp/test%d.Y /tmp/out.mpg
它将使用这些文件:
/tmp/test0.Y, /tmp/test0.U, /tmp/test0.V, /tmp/test1.Y, /tmp/test1.U, /tmp/test1.V, etc...
Y文件使用U和V文件分辨率的两倍。 它们是原始文件,没有标题。 它们可以由所有体面的视频解码器生成。 如果ffmpeg无法猜测,则必须使用-s选项指定图像的大小。
您可以从原始YUV420P文件输入:
ffmpeg -i /tmp/test.yuv /tmp/out.avi
test.yuv是一个包含原始YUV平面数据的文件。 每个帧由Y平面组成,接着是U和V平面,半垂直和水平分辨率。
您可以输出到原始YUV420P文件:
ffmpeg -i mydivx.avi hugefile.yuv
您可以设置多个输入文件和输出文件:
ffmpeg -i /tmp/a.wav -s 640x480 -i /tmp/a.yuv /tmp/a.mpg
将音频文件a.wav和原始YUV视频文件a.yuv转换为MPEG文件a.mpg。
您还可以同时进行音频和视频转换:
ffmpeg -i /tmp/a.wav -ar 22050 /tmp/a.mp2
将a.wav转换为22050 Hz采样率的MPEG音频。
您可以同时编码为多种格式,并定义从输入流到输出流的映射:
ffmpeg -i /tmp/a.wav -map 0:a -b:a 64k /tmp/a.mp2 -map 0:a -b:a 128k /tmp/b.mp2
将a.wav转换为64 kbits的a.mp2和128 kbits的b.mp2。 '-map file:index'按输出流定义的顺序指定每个输出流使用哪个输入流。
您可以转码解密的VOB:
ffmpeg -i snatch_1.vob -f avi -c:v mpeg4 -b:v 800k -g 300 -bf 2 -c:a libmp3lame -b:a 128k snatch.avi
这是一个典型的DVD翻录示例; 输入是一个VOB文件,输出一个带有MPEG-4视频和MP3音频的AVI文件。 请注意,在此命令中,我们使用B帧,因此MPEG-4流与DivX5兼容,GOP大小为300,这意味着对于29.97fps输入视频,每10秒一帧内帧。 此外,音频流是MP3编码的,因此您需要通过传递--enable-libmp3lame来启用LAME支持。 该映射对于DVD转码特别有用,以获得所需的音频语言。
注意:要查看支持的输入格式,请使用ffmpeg -demuxers。
您可以从视频中提取图像,也可以从许多图像中创建视频:
用于从视频中提取图像:ffmpeg -i foo.avi -r 1 -s WxH -f image2 foo-%03d.jpeg
这将从视频中每秒提取一个视频帧,并将其输出到名为foo-001.jpeg,foo-002.jpeg等的文件中。图像将被重新调整以适应新的WxH值。
如果只想提取有限数量的帧,可以将上述命令与-frames:v或-t选项结合使用,或与-ss结合使用以开始从某个时间点提取。
要从许多图像创建视频:
ffmpeg -f image2 -framerate 12 -i foo-%03d.jpeg -s WxH foo.avi
语法foo-%03d.jpeg指定使用由填充零的三个数字组成的十进制数来表示序列号。 它与C printf函数支持的语法相同,但只有接受普通整数的格式才适合。
导入图像序列时,-i还支持在内部扩展类似shell的通配符模式(globbing),方法是选择特定于image2的-pattern_type glob选项。
例如,要从与glob模式匹配的文件名创建视频foo - * .jpeg:
ffmpeg -f image2 -pattern_type glob -framerate 12 -i 'foo-*.jpeg' -s WxH foo.avi
您可以在输出中放置许多相同类型的流:
ffmpeg -i test1.avi -i test2.avi -map 1:1 -map 1:0 -map 0:1 -map 0:0 -c copy -y test12.nut
生成的输出文件test12.nut将以相反的顺序包含输入文件中的前四个流。
强制CBR视频输出:
ffmpeg -i myfile.avi -b 4000k -minrate 4000k -maxrate 4000k -bufsize 1835k out.m2v
四个选项lmin,lmax,mblmin和mblmax使用'lambda'单位,但您可以使用QP2LAMBDA常数轻松转换'q'单位:
ffmpeg -i src.ext -lmax 21*QP2LAMBDA dst.ext
7另见
ffmpeg-all, ffplay, ffprobe, ffmpeg-utils, ffmpeg-scaler, ffmpeg-resampler, ffmpeg-codecs, ffmpeg-bitstream-filters, ffmpeg-formats, ffmpeg-devices, ffmpeg-protocols, ffmpeg-filters
英文文档地址:http://www.ffmpeg.org/ffmpeg.html#Options
-
ffmpeg的中文学习文档
2019-02-28 18:51:00ffmpeg的中文学习文档文章目录:一、ffmpeg介绍二、学习参考文档1、中文 一、ffmpeg介绍 ffmpeg是视频处理工具,可选参数非常多,功能也非常的强大,可以用来开发各种视频处理工具,或者是应用到自己的代码中。 1...ffmpeg的中文学习文档
文章目录:一、ffmpeg介绍
ffmpeg是视频处理工具,可选参数非常多,功能也非常的强大,可以用来开发各种视频处理工具,或者是应用到自己的代码中。
1、ffmpeg的官方网站
https://www.ffmpeg.org/
2、ffmpeg下载地址
目前ffmpeg最新版本已经更新到4.1版本,支持Linux,windows,Mac OS 平台,下载地址:https://www.ffmpeg.org/download.html
3、官方文档
https://www.ffmpeg.org/documentation.html
4、ffmpeg的github地址
https://github.com/FFmpeg/FFmpeg
二、学习参考文档
1、中文
1、https://www.longqi.cf/tools/2015/02/13/ffmpegcn/
2、http://linux.51yip.com/search/ffmpeg
3、https://www.bookstack.cn/read/other-doc-cn-ffmpeg/ffmpeg-doc-cn-02.md
4、http://www.mikewootc.com/wiki/sw_develop/multimedia/ffmpeg_app_param.html
♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ -
ffmpeg的tutorial中文版 ffmpeg中文文档 详解FFMPEG API ffmpeg常用命令参数详解 文章 FFmpeg 学习(一):FFmpeg 简介 FFmpeg 学习(二):Mac下安装FFmpepg FFmpeg 学习(三):将 FFmpeg 移植到 Android平台 FFmpeg...
-
FFMPEG 编译
2021-08-26 20:45:52FFMPEG系列笔记记录 例如:第一章 FFMPEG编译 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 FFMPEG编译FFMPEG系列笔记记录前言一、FFMPEG是什么二、怎么使用1.环境准备1.1源码下载1.1NDK...
前言
最近想深入了解一下FFMPEG开源库的使用,于是着手从头弄一个轮子,然后按照自己的想法去造。
一、FFMPEG是什么
这个就不解释了,很强大的视频编解码库,初学者就了解到这么多了,很多内容我准备一遍探索一遍去完善笔记。
这里提供一些编解码功能去对视频进行操作。二、怎么使用
1.环境准备
由于编译好的FFMPEG准备在Android终端上使用,所以准备用NDK编译方式去编译,我这用的是linux编译环境,然后运行的Android终端是Android-9。
1.1源码下载
贴一个官网链接:http://www.ffmpeg.org/olddownload.html ,这里可以去找想要的版本
1.2NDK环境下载
这里使用的NDK环境是android-ndk-r11,NDK环境安装可以参考一下网上的文章,我这里因为是现成的,就没有安装了。=。=
忘记了,还有一个不错的编解码库openh264,记得下载这个不然会报错。PS:不同的NDK环境,编译FFMPEG的时候,会因为FFMPEG的版本变动而出现报错,需要手动解决。避免踩坑,建议使用已经成功编译的匹配版本,除非有些功能必须使用。
2.源码编译
2.1NDK编译
首先需要编译FFMPEG,根据编译环境,目标机器架构,以及NDK,需要进行配置。FFMPEG有一个配置脚本configure用来根据不同的环境需求进行配置,大概情况就是配置完之后编译,然后安装。这里用脚本来一次搞定。
#!/bin/bash NDK=/opt/android_build/android-ndk-r11 SYSROOT=$NDK/platforms/android-19/arch-arm/ TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64 CFLAGS="-O3 -Wall -DANDROID -DNDEBUG -nostdlib" EXTRA_CFLAGS="-march=armv7-a -mfpu=neon \ -mfloat-abi=softfp " OPTIMIZE_CFLAGS="-marm" CPU=arm PREFIX=****/FFmpeg-2.7.2-use-zip/android-21 #ADDI_CFLAGS="-I/home/ndk/arm/x264/include" #ADDI_LDFLAGS="-L/home/ndk/arm/x264/lib" ADDI_CFLAGS="-I/home/hzg/mypath/simpleexample_ffmpeg/openh264/include" ADDI_LDFLAGS="-L/home/hzg/mypath/simpleexample_ffmpeg/openh264/lib" #--disable-demuxers** #**--disable-decoders** #**--disable-devices** #**--disable-filters** #**--enable-decoder=h264** #**--enable-decoder=mp3*** #**--enable-demuxer=mpegts** function build_one { #make distclean ./configure \ --prefix=$PREFIX \ --enable-shared \ --enable-nonfree \ --enable-gpl \ --enable-swscale \ --enable-asm \ --enable-yasm \ --enable-stripping \ --disable-libx264 \ --enable-libopenh264 \ --enable-demuxers \ --enable-decoders \ --disable-yasm \ --disable-devices \ --disable-filters \ --disable-programs \ --disable-doc \ --disable-ffmpeg \ --disable-ffplay \ --disable-ffprobe \ --disable-ffserver \ --disable-avdevice \ --disable-doc \ --disable-symver \ --disable-debug \ --disable-network \ --disable-hwaccels \ --disable-indevs \ --disable-outdevs \ --disable-iconv \ --enable-fast-unaligned \ --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \ --target-os=linux \ --arch=arm \ --cpu=armv7-a \ --enable-cross-compile \ --sysroot=$SYSROOT \ --extra-cflags="-march=armv7-a -mfpu=neon -mfloat-abi=softfp -DFF_OPT_ZIP -DFF_OPT_LESSDIRTY -DWITH_CHANGE_BY_ZTE -DRECTIFY_YUV422 -DPAL_ENCODE -O0 $ADDI_CFLAGS" \ --extra-ldflags="$ADDI_LDFLAGS" #$ADDITIONAL_CONFIGURE_FLAG #--extra-cflags="-Os -fpic -mfpu noen\ #--extra-cflags="-Os -fpic -mfpu neon\ #--extra-cflags="-Os -mfpu neon -fPIC -DANDROID -mfpu=neon -mfloat-abi=softfp ADDI_CFLAGS " make clean make -j32 make DESTDIR=/home/hzg/mypath/simpleexample_ffmpeg/FFmpeg-2.7.2-use-zip/android-21 install } build_one
在configure文件配置一下如下库名
SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)' LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"' SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)' SLIB_INSTALL_LINKS='$(SLIBNAME)'
编译完FFMPEG之后,会在目标目录下生成对应的库,头文件,以及执行文件。
头文件:./build/include/libavutil/log.h ./build/include/libavutil/downmix_info.h ./build/include/libavutil/error.h ./build/include/libavutil/ripemd.h ./build/include/libavutil/fifo.h ./build/include/libavutil/imgutils.h ./build/include/libavutil/cpu.h ./build/include/libavutil/base64.h ./build/include/libavutil/random_seed.h ./build/include/libavutil/intreadwrite.h
库:
./android-21/lib/libavcodec-56.so ./android-21/lib/libswresample.so ./android-21/lib/libpostproc-53.so ./android-21/lib/libavcodec.so ./android-21/lib/libavutil-54.so ./android-21/lib/libavfilter.so ./android-21/lib/libpostproc.so ./android-21/lib/libswscale.so ./android-21/lib/libavformat.so ./android-21/lib/libavfilter-5.so ./android-21/lib/libavformat-56.so ./android-21/lib/libswresample-1.so ./android-21/lib/libswscale-3.so ./android-21/lib/libavutil.so
执行程序
ffmpeg ffprobe
2.2GCC编译
新建一个脚本build_linux.sh。一样的先配置,由于服务器原因,需要禁用x86asm,然后就是编译动态库,再增加一个安装路径。
./configure\ --disable-x86asm\ --enable-shared\ --prefix=./linux-build/ make install -j32
一样的会生成config.h,这个文件保存着编译的配置信息,是**./configure**运行的结果。其次是编译安装出来的程序/库/头文件
-rw-rw-r-- 1 hzg hzg 84419 Apr 25 15:47 config.h drwxrwxrwx 6 hzg hzg 4096 Apr 25 15:47 linux-build drwxrwxr-x 12 hzg hzg 12288 Apr 26 15:45 libavutil drwxrwxr-x 5 hzg hzg 4096 Apr 26 15:45 doc drwxrwxr-x 6 hzg hzg 4096 Apr 26 15:45 libswresample drwxrwxr-x 7 hzg hzg 4096 Apr 26 15:45 libswscale drwxrwxr-x 2 hzg hzg 4096 Apr 26 15:45 fftools drwxrwxr-x 14 hzg hzg 98304 Apr 26 15:45 libavcodec drwxrwxr-x 3 hzg hzg 45056 Apr 26 15:45 libavformat drwxrwxr-x 8 hzg hzg 40960 Apr 26 15:45 libavfilter drwxrwxr-x 3 hzg hzg 4096 Apr 26 15:45 libavdevice -rwxrwxr-x 1 hzg hzg 632840 Apr 26 15:45 ffprobe_g -rwxrwxr-x 1 hzg hzg 158024 Apr 26 15:45 ffprobe -rwxrwxr-x 1 hzg hzg 1096360 Apr 26 15:45 ffmpeg_g -rwxrwxr-x 1 hzg hzg 284832 Apr 26 15:45 ffmpeg
然后在使用的时候,引用头文件和库就好了。
gcc -o 264toyuv test.c -I./ffmpeg/linux-build/include -L./ffmpeg/linux-build/lib -lavformat -lavdevice -lavutil -lavcodec -lswresample -lswscale export LD_LIBRARY_PATH=/home_0421/hzg/mypath/ffmpeg/linux-build/lib:$LD_LIBRARY_PATH
因为是普通用户权限,自己编译生成的so库,编译器默认不会去生成的路径里去找,这样在运行程序的时候,load报错就在所难免了。如果将这些so库加入到变量LD_LIBRARY_PATH中,这样程序每次运行时都会去这里变量的路径里去找。所以需要将安装的库目录通过export LD_LIBRARY_PATH添加到引用路径里面。
这里想去测试一下psnr,去下载了一个yuv测试码流,然后通过ffmpeg将yuv码流编码生成h264压缩流,然后通过ffmpeg库将其解码成yuv,验证一下ffmpeg编解码的损失(编码图像效果)。解码demo:#include <stdio.h> /* printf, NULL */ #include <stdlib.h> /* strtod */ #include <errno.h> /* err catch */ #include "libavformat/avformat.h" #include "libswscale/swscale.h" #include "libavcodec/avcodec.h" #include "libavdevice/avdevice.h" #include "libavutil/avutil.h" #include "libavutil/frame.h" int h264_to_yuv420p(char* input_file, char* output_file) { if(input_file == NULL || output_file == NULL) { return -1; } char* in_file = input_file; char* out_file = output_file; AVFormatContext *fmt_ctx = NULL; AVCodecContext *cod_ctx = NULL; AVCodec *cod = NULL; struct SwsContext *img_convert_ctx = NULL; int ret = 0; AVPacket packet; //第一步创建输入文件AVFormatContext fmt_ctx = avformat_alloc_context(); if (fmt_ctx == NULL) { ret = -1; printf("alloc fail"); goto __ERROR; } if (avformat_open_input(&fmt_ctx, in_file, NULL, NULL) != 0) { ret = -1; printf("open fail"); goto __ERROR; } //第二步 查找文件相关流,并初始化AVFormatContext中的流信息 if (avformat_find_stream_info(fmt_ctx, NULL) < 0) { ret = -1; printf("find stream fail"); goto __ERROR; } av_dump_format(fmt_ctx, 0, in_file, 0); //第三步查找视频流索引和解码器 int stream_index = av_find_best_stream(fmt_ctx, AVMEDIA_TYPE_VIDEO, -1, -1, &cod, -1); //第四步设置解码器上下文并打开解码器 AVCodecParameters *codecpar = fmt_ctx->streams[stream_index]->codecpar; if (!cod) { ret = -1; printf("find codec fail"); goto __ERROR; } cod_ctx = avcodec_alloc_context3(cod); avcodec_parameters_to_context(cod_ctx, codecpar); ret = avcodec_open2(cod_ctx, cod, NULL); if (ret < 0) { printf("can't open codec"); goto __ERROR; } //第五步打开输出文件 FILE *out_fb = NULL; out_fb = fopen(out_file, "wb"); if (!out_fb) { printf("can't open file"); goto __ERROR; } //创建packet,用于存储解码前的数据 av_init_packet(&packet); //第六步创建Frame,用于存储解码后的数据 AVFrame *frame = av_frame_alloc(); frame->width = codecpar->width; frame->height = codecpar->height; frame->format = codecpar->format; av_frame_get_buffer(frame, 32); AVFrame *yuv_frame = av_frame_alloc(); yuv_frame->width = codecpar->width; yuv_frame->height = codecpar->height; yuv_frame->format = AV_PIX_FMT_YUV420P; av_frame_get_buffer(yuv_frame, 32); // size_t writesize = av_image_get_buffer_size(frame->format, frame->width,frame->height, 32); //第七步重采样初始化与设置参数 // uint8_t **data = (uint8_t **)av_calloc((size_t)out_channels, sizeof(*data)) img_convert_ctx = sws_getContext(codecpar->width, codecpar->height, codecpar->format, codecpar->width, codecpar->height, AV_PIX_FMT_YUV420P, SWS_BICUBIC, NULL, NULL, NULL); //while循环,每次读取一帧,并转码 //第八步 读取数据并解码,重采样进行保存 int count = 0; while (av_read_frame(fmt_ctx, &packet) >= 0) { if (packet.stream_index != stream_index) { av_packet_unref(&packet); continue; } ret = avcodec_send_packet(cod_ctx, &packet); if (ret < 0) { ret = -1; printf("decode error"); goto __ERROR; } while (avcodec_receive_frame(cod_ctx, frame) >= 0) { printf("decode frame count = %d\n" , count++); sws_scale(img_convert_ctx, (const uint8_t **)frame->data, frame->linesize, 0, codecpar->height, yuv_frame->data, yuv_frame->linesize); int y_size = cod_ctx->width * cod_ctx->height; fwrite(yuv_frame->data[0], 1, y_size, out_fb); fwrite(yuv_frame->data[1], 1, y_size/4, out_fb); fwrite(yuv_frame->data[2], 1, y_size/4, out_fb); } av_packet_unref(&packet); } __ERROR: if (fmt_ctx) { avformat_close_input(&fmt_ctx); avformat_free_context(fmt_ctx); } if (cod_ctx) { avcodec_close(cod_ctx); avcodec_free_context(&cod_ctx); } if (out_fb) { fclose(out_fb); } if (frame) { av_frame_free(&frame); } if (yuv_frame) { av_frame_free(&yuv_frame); } if(img_convert_ctx) { sws_freeContext(img_convert_ctx); } return ret; } int main () { h264_to_yuv420p("carphone_qcif.h264","out.yuv"); return 0; }
psnr测试
./psnr 176 144 420 ../../old/imagedata/carphone_qcif.yuv ../../old/imagedata/carphone_qcif_h264.yuv >carphone_qcif.txt
测试结果
psnr: 380 frames (CPU: 0 s) mean: 10.69 stdv: 0.86 carphone_qcif.txt 10.018 10.017 9.993 10.000 10.010 10.030 10.019 10.010 ... ... ... 10.204 10.176 10.153 10.158 10.153 10.165 10.262 10.147 10.138
3.引用
Android.mk
LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) #include Prebuild_Android.mk LOCAL_SRC_FILES:= \ main.c # simpl.c \ BUILD_PATH:=$(LOCAL_PATH)/FFmpeg-2.7.2-use-zip/android-21 LOCAL_C_INCLUDES := \ $(LOCAL_PATH)/FFmpeg-2.7.2-use-zip/build/include \ $(LOCAL_PATH)/openh264/include \ LOCAL_CFLAGS := LOCAL_CFLAGS += -fPIC -Wformat-security LOCAL_CFLAGS += $(CFLAGS) -g -O2 -DENABLE_FFMPEG=1 LOCAL_LDFLAGS := LOCAL_LDFLAGS += $(BUILD_PATH)/lib/libavformat.a LOCAL_LDFLAGS += $(BUILD_PATH)/lib/libavfilter.a LOCAL_LDFLAGS += $(BUILD_PATH)/lib/libpostproc.a LOCAL_LDFLAGS += $(BUILD_PATH)/lib/libswscale.a LOCAL_LDFLAGS += $(LOCAL_PATH)/FFmpeg-2.7.2-use-zip/build/lib/libavdevice.a LOCAL_LDFLAGS += $(BUILD_PATH)/lib/libavcodec.a LOCAL_LDFLAGS += $(BUILD_PATH)/lib/libavformat.a LOCAL_LDFLAGS += $(BUILD_PATH)/lib/libavutil.a LOCAL_LDFLAGS += $(BUILD_PATH)/lib/libswresample.a LOCAL_LDFLAGS += $(LOCAL_PATH)/openh264/libopenh264.a #数学库和libz压缩库依赖 #LOCAL_LDFLAGS += -lswresample LOCAL_LDFLAGS += -lm -lz LOCAL_STATIC_LIBRARIES := LOCAL_SHARED_LIBRARIES := LOCAL_MODULE:= test_ffmpeg include $(BUILD_EXECUTABLE) include Prebuild_Android.mk
总结
中途遇到的报错记录一下
链接报错./FFmpeg-2.7.2-use-zip/build/lib/libavformat.a(id3v2.o):id3v2.c:function id3v2_parse: error: undefined reference to 'uncompress' ./FFmpeg-2.7.2-use-zip/build/lib/libavcodec.a(zip_decoder.o):zip_decoder.c:function zip_decompress.isra.3: error: undefined reference to 'inflateInit_' ./FFmpeg-2.7.2-use-zip/build/lib/libavcodec.a(zip_decoder.o):zip_decoder.c:function zip_decompress.isra.3: error: undefined reference to 'inflate' ./FFmpeg-2.7.2-use-zip/build/lib/libavcodec.a(zip_decoder.o):zip_decoder.c:function zip_decompress.isra.3: error: undefined reference to 'inflateEnd' ./FFmpeg-2.7.2-use-zip/build/lib/libavcodec.a(zip_decoder.o):zip_decoder.c:function zip_decompress.isra.3: error: undefined reference to 'inflateEnd' ./FFmpeg-2.7.2-use-zip/build/lib/libavcodec.a(zip_decoder.o):zip_decoder.c:function zip_decoder_decode_begin: error: undefined reference to 'zlibVersion' ./FFmpeg-2.7.2-use-zip/build/lib/libavcodec.a(zip_decoder.o):zip_decoder.c:function zip_decoder_decode_begin: error: undefined reference to 'zlibVersion' ./FFmpeg-2.7.2-use-zip/build/lib/libavcodec.a(zip_decoder.o):zip_decoder.c:function zip_decoder_decode_begin: error: undefined reference to 'zlibVersion' ./FFmpeg-2.7.2-use-zip/build/lib/libavcodec.a(zip_decoder.o):zip_decoder.c:function zip_decoder_decode_begin: error: undefined reference to 'zlibVersion'
解决办法
It’s because libavcodec includes some math and zlib headers, so you must link to the respective libraries as well
因为使用了math和zlib库,所以编译的时候需要添加相应的库运行报错
CANNOT LINK EXECUTABLE DEPENDENCIES: library "libavformat.so.56" not found
解决办法
提示找不到libavformat.so.56,这里.56是对应的库版本号,编译的时候,有参照前人的办法,在configure文件中将编译出来的库名字做修改了,但是会出现.a,.so,.so.56,这里我引用动态库都会报错这个,引用静态库就可以了。只是说找到解决办法了,深入原因有大佬清楚可以一起讨论
Demo编译
编译
g++ -o main list_codecinfo.cpp -I /home/hzg/mypath/ffmpeg/Dev/ffmpeg-win64-dev/ffmpeg-20200106-1e3f4b5-win64-dev/include/libavformat -I /home/hzg/mypath/ffmpeg/Dev/ffmpeg-win64-dev/ffmpeg-20200106-1e3f4b5-win64-dev/include -L/home/hzg/mypath/ffmpeg/Dev/ffmpeg-win64-dev/ffmpeg-20200106-1e3f4b5-win64-dev/lib -lavcodec.dll -lavformat.dll gcc test.c -I ffmpeg/ -Lffmpeg/libavformat -Lffmpeg/libavdevice/ -static -lavformat -lavdevice -o 264toyuv
指令
ffplay https://magiclen.org/ffmpeg-h265/
ffplay -video_size 3840x2160 -i "C:\Users\10257818\Desktop\imagedata\编码视频\kaoya2\ky_683.yuv" 指定分辨率播放YUV
通过FFmpeg输出视觉无损的H.265/HEVC视频的指令如下:
ffmpeg -s 3840x2160 -i C:\Users\10257818\Desktop\imagedata\yuv\ky_685.yuv -vcodec libx265 -crf 18 C:\Users\10257818\Desktop\imagedata\yuv\aaa.h265 ffmpeg -s 3840x2160 -i C:\Users\10257818\Desktop\imagedata\yuv\ky_685.yuv -vcodec libx265 C:\Users\10257818\Desktop\imagedata\yuv\bbb.h265
使用最高的压缩效果来输出视觉无损的H.265/HEVC视频,指令如下:
ffmpeg -i 输入的影音文件路径 -vcodec libx265 -crf 20 -preset placebo 输出的影音文件路径
将H265/H264码流解码成YUV数据
ffmpeg -i C:\Users\10257818\Desktop\imagedata\yuv\bbb.h265 -vcodec libx265 C:\Users\10257818\Desktop\imagedata\yuv\ccc.yuv ffmpeg -i C:\Users\10257818\Desktop\imagedata\yuv\carphone_qcif.h264 -vcodec libx264 C:\Users\10257818\Desktop\imagedata\yuv\carphone_qcif_h264.yuv
将YUV数据编码成H265/H264码流
ffmpeg -s 3840x2160 -i C:\Users\10257818\Desktop\imagedata\yuv\ky_685.yuv -vcodec libx265 C:\Users\10257818\Desktop\imagedata\yuv\bbb.h265 ffmpeg -s 3840x2160 -i C:\Users\10257818\Desktop\imagedata\yuv\ky_685.yuv -vcodec libx265 -crf 18 C:\Users\10257818\Desktop\imagedata\yuv\aaa.h265 ffmpeg -s 176x144 -i C:\Users\10257818\Desktop\imagedata\yuv\carphone_qcif.yuv -vcodec libx265 -crf 18 C:\Users\10257818\Desktop\imagedata\yuv\carphone_qcif.h265 ffmpeg -s 176x144 -i C:\Users\10257818\Desktop\imagedata\yuv\carphone_qcif.yuv -vcodec libx264 -crf 18 C:\Users\10257818\Desktop\imagedata\yuv\carphone_qcif.h264
无损压缩
ffmpeg -i 输入的影音文件路径 -vcodec libx265 -x265-params lossless=1 -preset placebo 输出的影音文件路径
psnr
./psnr 176 144 420 ../../old/imagedata/carphone_qcif.yuv ../../old/imagedata/carphone_qcif_h264.yuv >carphone_qcif.txt
ffmpeg编码YUV420视频序列
ffmpeg -s 1280x720 -i 720p50_parkrun_ter.yuv -r 50 720p50_parkrun_ter.h264
下面这条命令,实现了从摄像头读取数据并编码为H.264,最后保存成mycamera.mkv。
ffmpeg -f dshow -i video="HD 720P Webcam" -vcodec libx264 mycamera.mkv
使用ffplay可以直接播放摄像头的数据,命令如下
ffplay -f dshow -i video="HD 720P Webcam"
录屏,伴随话筒输入的声音
ffmpeg -f dshow -i video="screen-capture-recorder" -f dshow -i audio="内装麦克风 (Conexant 20672 SmartAudi" -r 5 -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -acodec libmp3lame MyDesktop.mkv
录屏,伴随耳机输入的声音
ffmpeg -f dshow -i video="screen-capture-recorder" -f dshow -i audio="virtual-audio-capturer" -r 5 -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -acodec libmp3lame MyDesktop.mkv
抓屏
ffmpeg -f gdigrab -i desktop out.mpg
从屏幕的(10,20)点处开始,抓取640x480的屏幕,设定帧率为5
ffmpeg -f gdigrab -framerate 5 -offset_x 10 -offset_y 20 -video_size 640x480 -i desktop out.mpg
将两个WAV缝合到一起
ffmpeg -i 1.wav -i 2.wav -i 3.wav ...... -i {n}.wav -filter_complex '[0:0][1:0]......[{n-1}:0]concat=n={n}:v=0:a=1[out]' -map '[out]' final.wav
ffmpeg -i input.avi output.mp4 【视频格式转换/视频容器转换,常用视频格式.avi .mp4 .ts .flv .rmvb .mkv】 ffmpeg -i 晓松奇谈.mp4 -acodec copy -vn output.aac 【提取音频】 ffmpeg -i input.mp4 -vcodec copy -an output.mp4 【提取视频】 ffmpeg -ss 00:00:15 -t 00:00:05 -i input.mp4 -vcodec copy -acodec copy output.mp4 【视频剪切,-ss表示开始切割的时间,-t表示要切多少,从时间为00:00:15开始,截取5秒钟的视频】 ffmpeg -i input.mp4 -b:v 2000k -bufsize 2000k -maxrate 2500k output.mp4 【码率控制,-b:v主要是控制平均码率,配套-bufsize使用,-maxrate,-minrate分别表示最大和最小波动】 ffmpeg -i input.mp4 -vcodec h264 output.mp4 【视频编码格式转换,将MPEG4编码格式的视频转换成H264】 ffmpeg -i input.mp4 -c:v libx265 output.mp4 【视频编码格式转换,ffmpeg编译的时候,添加了外部的x265】 ffmpeg -i input.mp4 –vcodec copy –an –f m4v output.h264 【只提取视频ES数据】 ffmpeg -i 1.ts -vcodec copy -an -f rawvideo es.raw 【只提取视频ES数据,ts流转es流】 ffmpeg -i 1.mp4 -vcodec copy -an -f rawvideo -vbsf h264_mp4toannexb es.raw 【只提取视频ES数据,mp4流转es流】 ffmpeg -i input.mp4 -vf scale=960:540 output.mp4 【过滤器使用,将输入的1920*1082缩放到960*540输出】 ./ffmpeg -i input.mp4 -i iQIYI_logo.png -filter_complex overlay output.mp4 【过滤器使用,为视频添加logo,默认左上角】-vf代替的-filer-complex ffmpeg -i F:\VideoEncDec\ffmpeg\VideoSimple\wuxiannizhuan.mp4 -i C:\Users\10257818\Desktop\ZTE.png -filter_complex "[1:v][0:v]scale2ref=(W/H)*ih/8/sar:ih/8[wm][base];[base][wm]overlay=10:10" -pix_fmt yuv420p -c:a copy C:\Users\10257818\Desktop\filterZTEzishiying.mp4 ./ffmpeg -i input.mp4 -i logo.png -filter_complex overlay=W-w output.mp4 【过滤器使用,为视频添加logo,右上角】 ./ffmpeg -i input.mp4 -i logo.png -filter_complex overlay=0:H-h output.mp4 【过滤器使用,为视频添加logo,左下角】 ./ffmpeg -i input.mp4 -i logo.png -filter_complex overlay=W-w:H-h output.mp4 【过滤器使用,为视频添加logo,右下角】 ffmpeg -i input.mp4 -vf delogo=0:0:220:90:100:1 output.mp4 【过滤器使用,去掉视频的logo】
语法:-vf delogo=x:y:w:h[:t[:show]]
x:y 离左上角的坐标
w:h logo的宽和高
t: 矩形边缘的厚度默认值4
show:若设置为1有一个绿色的矩形,默认值0。ffmpeg -i input.mp4 -r 1 -q:v 2 -f image2 pic-%03d.jpeg 【抓取视频的一些帧,存为jpeg图片】
语法:-r 表示每一秒几帧
-q:v表示存储jpeg的图像质量,一般2是高质量ffmpeg -i input.mp4 -ss 00:00:20 -t 10 -r 1 -q:v 2 -f image2 pic-%03d.jpeg 【抓取视频的一些帧,存为jpeg图片,设置抓取时间和时间间隔】
语法:-ss 表示开始时间
-t表示共要多少时间ffmpeg -i input.mp4 output.yuv 【输出YUV420原始数据,可以使用RawPlayer播放】 ffmpeg -i input.mp4 -ss 00:00:20 -t 10 -r 1 -q:v 2 -f image2 pic-%03d.jpeg + ffmpeg -i pic-001.jpeg -s 1440x1440 -pix_fmt yuv420p xxx3.yuv 【抽取某一帧YUV数据,先从视频中抽出jpeg帧图片,然后再将jpeg转换成YUV】 ffmpeg -i input -vf “trim=start_frame=0:end_frame=1” out.yuv 【评论给出的建议】 ffmpeg -i input.mp4 -profile:v baseline -level 3.0 output.mp4 【控制profile&level,以适应于不同的设备,解码能力和文件大小平衡,baseline,main,high,extended】 ffmpeg -i input.mp4 -c:v libx264 -x264-params "profile=high:level=3.0" output.mp4 【控制profile&level,ffmpeg编译时添加了external的libx264】 ffmpeg -i input.mp4 -c:v libx265 -x265-params "profile=high:level=3.0" output.mp4 【H265(HEVC)编码tile&level控制】 ffmpeg -list_devices true -f dshow -i dummy 【列出当前音视频设备】
打开Cmd命令行控制台,进入FFmpeg的Bin目录,输入如下命令:
ffmpeg -list_devices true -f dshow -i dummy [dshow @ 0000022eb0b2a540] DirectShow video devices (some may be both video and audio devices) [dshow @ 0000022eb0b2a540] "HD 720P Webcam" [dshow @ 0000022eb0b2a540] Alternative name "@device_pnp_\\?\usb#vid_0c45&pid_6340&mi_00#6&17bbfbbc&0&0000#{65e8773d-8f56-11d0-a3b9-00a0c9223196}\global" [dshow @ 0000022eb0b2a540] DirectShow audio devices [dshow @ 0000022eb0b2a540] "楹﹀厠椋?(2- USB Microphone)"[dshow @ 0000022eb0b2a540] Alternative name "@device_cm_{33D9A762-90C8-11D0-BD43-00A0C911CE86}\wave_{54896F77-1473-4AB0-8A17-109275DBF87B}"
在上面的命令行窗口中列出了两个设备,一个是视频采集设备,另外是一个音频采集设备。另外,我们发现:音频设备的名称有乱码,因为其中有中文名称,后面在讲到用API采集数据的时候会提到解决这个问题的方法。接着我们输入另外一个命令行:
ffmpeg -list_options true -f dshow -i video="HD 720P Webcam"
这个命令行的作用是获取指定视频采集设备支持的分辨率、帧率和像素格式等属性,返回的是一个列表
[dshow @ 0000018e1c16b540] pixel_format=yuyv422 min s=1184x656 fps=10 max s=1184x656 fps=10 [dshow @ 0000018e1c16b540] pixel_format=yuyv422 min s=1184x656 fps=10 max s=1184x656 fps=10 [dshow @ 0000018e1c16b540] vcodec=mjpeg min s=1280x720 fps=15 max s=1280x720 fps=33 [dshow @ 0000018e1c16b540] vcodec=mjpeg min s=1280x720 fps=15 max s=1280x720 fps=33
下面我们执行另外一条命令,将摄像头的图像和麦克风的音频录制保存成一个文件。命令如下:
ffmpeg -f dshow -i video="HD 720P Webcam" -f dshow -i audio="麦克风 (2- USB Microphone)" -vcodec libx264 -acodec aac -strict -2 mycamera.mkv
上面的命令行用video=指定视频设备,用audio=指定音频设备,后面的参数是定义编码器的格式和属性,输出为一个名为mycamera.mkv的文件。命令运行之后,控制台打印FFmpeg的运行日志,按“Q”键则中止命令。这里有些读者可能会问:采集设备不是支持多个分辨率吗?怎么设置采集时用哪一种分辨率输出?答案是用“-s”参数设置,若在上面的命令行加上“-s 720x576”,则FFmpeg就会以720x576的分辨率进行采集,如果不设置,则以默认的分辨率输出。
-
ffmpeg的介绍,编译与使用
2021-06-20 16:21:34ffmpeg是广泛使用的多媒体解决方案,既是一款音视频编解码工具,同时也是一组音视频编解码开发套件,作为编解码开发套件,它为开发者提供了丰富的音视频处理的调用接口。 -
ffmpeg学习笔记5 编译ffmpeg(Win10+android-ndk-r22)
2022-05-04 21:09:45笔者尝试在win10下,编译android版本的ffmpeg,前面做了不少准备,终于可以编译了 一、安装MSYS2 下载地址:MSYS2 安装完成后执行如下命令 pacman -S --needed base-devel mingw-w64-x86_64-toolchain 安装所... -
FFmpeg相关资源
2021-05-08 21:44:33ffmpeg官网:https://ffmpeg.org/ ffmpeg git地址:https://git.ffmpeg.org/gitweb/ffmpeg.git ffmpeg代码覆盖报告:http://coverage.ffmpeg.org/ ffmpeg视频处理入门教程:... ffmpeg gith -
FFmpeg命令行使用手册-devices输入输出设备汇总篇
2020-08-26 21:03:09本系列介绍ffmpeg命令行中有关-devices输入输出设备的支持和使用。 输入设备(input devices)用于采集/抓取来自连接到系统的多媒体设备的数据,比如采集麦克风/话筒的音频采样数据,桌面屏幕图像数据,摄像头/相机... -
【FFmpeg笔记】04-Win10编译ffmpeg4.2.1(For Windows)
2020-09-09 11:30:58上次在 Win10下编译了 Android版 FFmpeg(《13、Win10编译ffmpeg4.2.1(For Android)》) 这一次我们在 Win10下编译 Windows版本 FFmpeg,并且采用 Visual Studio 2019来开发,这样查看源码和调试都比较方便。 所... -
FFmpeg学习—android 编译 ffmpeg 集成fdk-aac、x264 精简解码库-Go语言中文社区
2021-06-04 09:36:091.编译要求Ubuntu 14.04 lts 64位ffmpeg-3.1.3fdk-aac-0.1.4x264-snapshot-20170407-2245android-ndk-r12b2.编译步凑1.先单独编译x264和fdk-aac 的Android 平台的库。x264单独编译的方法:fdk-aac单独编译的方法:2.... -
[Android开发]使用NDK编译FFmpeg到Android下使用
2021-05-28 08:01:16这次使用 ndk r14 进行对 ffmpeg 3.2.4编译,使其能移植到Android下使用之前尝试在window 10环境下用NDK对FFmpeg进行编译,发现坑太多,各种路径不认。最后还是决定在虚拟机上安装Ubuntu再对其编译。前期准备:1.... -
ffmpeg编译为webassembly
2021-08-20 16:48:12webassembly介绍 WebAssembly(缩写为 wasm)是一种使用非 JavaScript 代码,并使其在浏览器中运行的方法。这些代码可以是 C、C++ 或 Rust 等。它们会被编译进你的浏览器,在你的 CPU 上以接近...ffmpeg编译成wasm ... -
ffmpeg-java-android视频处理
2019-05-23 17:58:31也有中文版地址。 网上关于ffmpeg java引入的帖子大多是先有ffmpeg可执行工具,然后再java模拟os命令执行。 而我们项目会在客户方的服务器上部署,当时看到这类帖子第一个想法是,客户方服务器是集群的,总不能让... -
ffmpeg网站
2015-04-15 16:51:59一、 FFmpeg主站 1. FFmpeg的源码发布,资料 网址: http://www.ffmpeg.org/ 源代码镜像站点 网址: https://github.com/FFmpeg/FFmpeg 2. 维基百科 http://zh.wikipedia.org/zh-cn/FFmpeg 3. 百度百科 ... -
FFmpeg-python使用的一二之一
2019-08-19 19:59:34FFmpeg中文文档(民间翻译):https://www.bookstack.cn/read/other-doc-cn-ffmpeg/README.md 在使用FFmpeg-python库之前,建议先使用FFmpeg工具、看官方文档,熟悉一下FFmpeg的功能和指令格式。在使用第三方... -
ffmpeg--编译ffmpeg-4.0的源码
2018-05-24 16:07:172.下载ffmpeg的源码,不用爬梯,直接官网可以下载:http://www.ffmpeg.org/download.html3.编译Android可用的动态库。需要配置某些东西,主要跟动态库名字有关,不修改,Android无法识别。修改如下:下载F... -
ffmpeg的那点小事儿--ffmpeg的导入和视频解码,YUV保存(ffmpeg4.0.2)
2018-10-24 10:12:07一、ffmpeg开发的基本知识了解 第一点:一个视频播放流程 通常看到视频格式:mp4、mov、flv、wmv等等… 称之为:封装格式 第二点:视频播放器 两种模式播放器 第一种:可视化界面播放器(直接... -
Unbuntu环境编译 Android平台可用ffmpeg(带三方库fdk-aac和lame)
2022-01-03 22:36:07Unbuntu环境编译 Android平台可用ffmpeg(带三方库fdk-aac和lame) -
ffmpeg跨平台录音技术详解
2020-01-16 18:38:57ffmpeg开发的基本知识 linux下的录音 windows下的录音 示例代码 遇到的一些工程问题 如果想要编码为MP3文件保存,需要怎么做? 为什么编译的时候老是显示对xxxx函数未定义的引用? ffmpeg开发的基本知识 这部分... -
ffmpeg filter过滤器 基础实例及全面解析
2020-07-28 10:47:51首先是名字:中文名,就称为ffmpeg过滤器,当然也有人称为ffmpeg 滤镜。(用滤镜听起来好像是给video用的,所以不太好,因为audio也可以用) ffmpeg目录下,有个文件夹叫libavfilter,它可以单独编译为一个库。干嘛... -
音视频开源基础学习 - 编译ffmpeg
2022-03-22 21:24:56S mingw-w64-x86_64-SDL2 # 重命名/usr/bin/link.exe,避免冲突 cd /usr/bin mv link.exe link.bak # yasm pacman -S yasm # 如果没有找到cl,link,代表VS which cl link yasm cpp 设置中文支持,右键打开Option->... -
Ubuntu 16.04下安装ffmpeg和opencv的安装与简介
2019-08-19 16:28:37ffmpeg简介 ** 关于音视频解码的学习内容:推荐雷神的音频视频编解码的学习地址! ** ffmpeg一种完整的跨平台解决方案,用于录制,转换和流式传输音频和视频 编译好的windows可用版本的下载地址(官网中可以连接到这... -
mac脚本编译ffmpeg源码:make: *** No rule to make target ffmpeg-3.3/Makefile‘. Stop
2020-07-20 20:48:35make: *** No rule to make target ffmpeg-3.3/Makefile'. Stop -
Ubuntu环境下编译FFmpeg的流程
2020-12-30 19:14:46Ubuntu环境下编译FFmpeg的流程 在Windows10系统下,安装Ubuntu系统 不需要安装虚拟机,使用Window10自带的ubuntu引导程序安装ubuntu系统。 安装步骤: ,控制面板->程序->启用或关闭Windows功能 打开 ... -
ffmpeg视频字幕乱码
2016-12-02 11:04:16ffmpeg字幕乱码,视频字幕乱码 -
【FFMpeg】源码编译
2021-08-07 12:19:14【一】使用apt命令安装...sudo add-apt-repository ppa:kirillshkrogalev/ffmpeg-next sudo apt-get update sudo apt-get install ffmpeg 3、官方安装包 http://ppa.launchpad.net/kirillshkrogalev/ffmpeg-next/ubu -
FFmpeg学习资料
2020-07-16 09:18:45https://ffmpeg.org/ ffmpeg官网网站 ...FFmpeg中文网站-夏曹俊 相关资料 windows 平台使用 VS2017 编译 libevent 源码 FFMPEG系列课程(一)打开视频解码器 http://ffmpeg.club/xiacaojun.html C++ FFMp