FFmpeg基本命令
1. 查询命令帮助文档
- 基本信息:ffmpeg -h
- 高级信息:ffmpeg -h long
- 所有信息:ffmpeg -h full
ffplay和ffprobe的帮助文档同理。
但ffmpeg/ffplay/ffprobe部分参数通用,部分参数不通用,在使用时需要注意。
2. FFmpeg音视频处理流程
FFmpeg的音视频处理流程如下:
- 解封装(Demuxing) :解封装是指从媒体文件(如MP4、AVI等)中分离出音频、视频、字幕等原始数据流的过程。这一步主要涉及到容器格式的解析。
- 解码(Decoding) :解码是指将原始的音频和视频数据流转换为可以被播放器理解和播放的原始帧数据。解码的过程通常需要对应的编解码器。
- 过滤(Filtering) :在解码后,原始的帧数据可以被送入过滤器进行各种处理,例如改变分辨率、剪辑、添加水印、调整亮度、对比度等。
- 编码(Encoding) :过滤后的帧数据需要重新进行编码,以便于存储和传输。编码的过程会将原始帧数据转换为特定格式的音频和视频数据流,通常需要对应的编解码器。
- 封装(Muxing) :最后,编码后的音频、视频、字幕等数据流需要被封装到一个媒体文件中,例如MP4、AVI等。
在实际使用中,这些步骤可以根据需要进行组合,例如只进行解封装和封装,或者只进行解码和编码等。
3. FFmpeg命令分类查询
命令详细分类查询:如果你想查找更详细的选项信息,可以使用更具体的帮助标志。例如:
ffmpeg -h full 显示所有选项(包括所有格式、编解码器、过滤器、协议等的选项)。
ffmpeg -h demuxer=mov 显示mov解封装器的选项。
ffmpeg -h encoder=aac 显示AAC编码器的选项。
这是一些常用命令:
- -version:这个命令用于查看你安装的FFmpeg的版本信息。例如,你可以在命令行中输入
ffmpeg -version,然后回车,你将会看到你的FFmpeg版本号,以及你的FFmpeg支持的库和配置信息。 - -buildconf:这个命令可以查看FFmpeg构建配置信息。输入
ffmpeg -buildconf,可以看到FFmpeg的编译配置,包括各种选项和库的使用情况。 - -formats:这个命令可以查看FFmpeg支持的所有媒体格式。在命令行中输入
ffmpeg -formats,将列出所有FFmpeg可以读写的媒体格式。 - -muxers:这个命令用于列出所有的封装器(muxer)。封装器用于将音频、视频等流封装到媒体文件中。输入
ffmpeg -muxers,将列出所有可用的封装器。 - -demuxers:这个命令用于列出所有的解封装器(demuxer)。解封装器用于从媒体文件中分离出音频、视频等流。输入
ffmpeg -demuxers,将列出所有可用的解封装器。 - -codecs:这个命令用于列出所有的编解码器。编解码器用于编码和解码音频或视频流。输入
ffmpeg -codecs,将列出所有可用的编解码器。 - -decoders:这个命令用于列出所有的解码器。解码器用于解码音频或视频流。输入
ffmpeg -decoders,将列出所有可用的解码器。 - -encoders:这个命令用于列出所有的编码器。编码器用于编码音频或视频流。输入
ffmpeg -encoders,将列出所有可用的编码器。
ffmpeg.org/documentati… 提供了完整的命令和选项列表,以及各种示例和教程。
4. FFplay播放控制
FFplay是FFmpeg项目的一部分,它是一个简单的媒体播放器,可以播放音频和视频文件。在命令行环境下,我们可以使用以下命令进行播放控制:
空格键:暂停或者恢复播放。
左方向键:在媒体文件中后退10秒。
右方向键:在媒体文件中前进10秒。
上方向键:在媒体文件中前进1分钟。
下方向键:在媒体文件中后退1分钟。
f:切换全屏播放。
q/esc:停止播放并退出。
9:降低音量。
0:提高音量。
m:静音。
a:循环切换音频流。
v:循环切换视频流。
c:循环切换整个音视频。
w:循环切换过滤器或显示模式。
s:逐帧播放。
5. FFplay命令选项
以下是FFplay的一些主要命令选项:
-an:禁用音频。
-vn:禁用视频。
-sn:禁用字幕。
-ss [time] :跳跃到指定的时间位置开始播放。这个时间可以是秒数,也可以是 hh:mm:ss[.xxx] 格式。
-t [duration] :设置播放的持续时间。这个时间可以是秒数,也可以是 hh:mm:ss[.xxx] 格式。
-fs:开始全屏播放。
-volume [0-100] :设置音量。默认值为100。
-window_title [title] :设置窗口标题。
-left [value] :设置窗口左上角的x坐标。
-top [value] :设置窗口左上角的y坐标。
-x [width] :设置窗口宽度。
-y [height] :设置窗口高度。
-scodec [codec] :设置字幕解码器。你可以使用 -scodec copy 选项来复制字幕流,而不进行解码。
-acodec [codec] :设置音频解码器。你可以使用 -acodec copy 选项来复制音频流,而不进行解码。
-vcodec [codec] :设置视频解码器。你可以使用 -vcodec copy 选项来复制视频流,而不进行解码。
-sync [type] :设置音视频同步方法。可选的类型有 "audio"(默认,以音频为主进行同步)、"video"(以视频为主进行同步)和 "ext"(以外部时钟为主进行同步)。
**
6. FFplay命令播放媒体
在FFplay中,播放YUV、RGB和PCM数据有一些特别的要求,因为这些是未经编码的原始数据,所以需要提供一些额外的参数来正确解析和播放。
1. 播放YUV数据
对于YUV数据,我们需要指定YUV的格式和分辨率。假设我们有一个分辨率为1280x720的YUV420p格式的文件test.yuv,可以使用以下命令播放:
ffplay -f rawvideo -pix_fmt yuv420p -s 1280x720 test.yuv
-f rawvideo:指定输入文件的格式为原始视频数据。-pix_fmt yuv420p:指定像素格式为YUV420p。-s 1280x720:指定视频的分辨率为1280x720。
2. 播放RGB数据
对于RGB数据,也需要指定像素格式和分辨率。假设我们有一个分辨率为1280x720的RGB24格式的文件test.rgb,可以使用以下命令播放:
ffplay -f rawvideo -pix_fmt rgb24 -s 1280x720 test.rgb
-pix_fmt rgb24:指定像素格式为RGB24。
3. 播放PCM数据
对于PCM音频数据,我们需要指定音频格式、采样率、声道数等。假设我们有一个16位、44.1kHz、双声道的PCM文件test.pcm,可以使用以下命令播放:
ffplay -f s16le -ar 44100 -ac 2 test.pcm
-f s16le:指定输入文件的格式为16位小端(Little Endian)PCM数据。-ar 44100:指定音频的采样率为44.1kHz。-ac 2:指定音频的声道数为2(双声道)。
7. FFplay简单过滤器
在FFplay中可以使用-vf选项来指定一系列的视频过滤器,或者使用-af选项来指定音频过滤器。下面是一些例子,但一般过滤器会结合具体算法使用,初级开发者一般不会接触如何使用过滤器。
- 旋转视频:你可以使用
transpose过滤器来旋转视频。以下命令将视频旋转90度顺时针:
ffplay -vf "transpose=1" video.mp4
2. 调整视频大小:你可以使用scale过滤器来调整视频的大小。以下命令将视频的大小调整为640x480:
ffplay -vf "scale=640:480" video.mp4
3. 裁剪视频:你可以使用crop过滤器来裁剪视频。以下命令将视频裁剪为从左上角开始的400x400的区域:
ffplay -vf "crop=400:400:0:0" video.mp4
4. 改变播放速度:你可以使用setpts过滤器来改变播放速度。以下命令将视频的播放速度减半:
ffplay -vf "setpts=2.0*PTS" video.mp4
5. 增大音量:你可以使用volume过滤器来增大音量。以下命令将音量增大到原来的两倍:
ffplay -af "volume=2.0" audio.mp3
8. FFmpeg命令参数说明
FFmpeg的命令行工具有很多参数,这些参数可以用来控制视频和音频的编解码、转封装、过滤等各种功能。以下是一些常用参数的解释:
- -i [file] :指定输入文件。例如:
-i input.mp4 - -f [format] :指定输入或输出文件的格式。例如:
-f mp4 - -c:v [codec] :指定视频的编解码器。例如:
-c:v libx264使用x264编解码器进行视频编码。 - -c:a [codec] :指定音频的编解码器。例如:
-c:a aac使用AAC编解码器进行音频编码。 - -b:v [bitrate] :设置视频的比特率。例如:
-b:v 1M设置视频比特率为1Mbit/s。 - -b:a [bitrate] :设置音频的比特率。例如:
-b:a 128k设置音频比特率为128Kbit/s。 - -s [width]x[height] :设置视频的分辨率。例如:
-s 1280x720 - -r [fps] :设置视频的帧率。例如:
-r 30 - -vf [filtergraph] :设置视频过滤器。例如:
-vf "scale=640:480" - -af [filtergraph] :设置音频过滤器。例如:
-af "volume=2.0" - -ss [time] :从指定的时间开始处理输入文件。例如:
-ss 00:01:00 - -t [duration] :设置处理的持续时间。例如:
-t 30 - -y:如果输出文件已存在,覆盖它。
9. FFmpeg命令提取音视频数据
使用 FFmpeg 命令,我们可以提取音频或者视频数据。以下是一些基本的例子:
- 提取音频
ffmpeg -i input.mp4 -vn -acodec copy output.aac
-i input.mp4表示输入文件是 input.mp4-vn表示禁用视频,因为我们只想要音频-acodec copy表示音频编解码器直接复制,意味着我们不重新编码音频,而只是从源文件中提取音频数据output.aac表示输出的音频文件名
- 提取视频
ffmpeg -i input.mp4 -an -vcodec copy output.mp4
-i input.mp4表示输入文件是 input.mp4-an表示禁用音频,因为我们只想要视频-vcodec copy表示视频编解码器直接复制,意味着我们不重新编码视频,而只是从源文件中提取视频数据output.mp4表示输出的视频文件名
以上命令在提取音视频数据时,保留了原有的编码,不进行重新编码。如果需要转换编码格式,可以替换copy为目标编解码器,例如 -acodec libmp3lame 或 -vcodec libx264。
10. FFmpeg命令提取像素格式和PCM数据
在使用FFmpeg处理媒体文件时,我们可以提取像素格式和PCM数据。这些数据是未编码的原始数据,所以我们需要使用一些特别的参数来提取它们。
1. 提取像素格式
像素格式通常用于表示视频帧的数据结构。例如,YUV420p和RGB24都是常见的像素格式。假设我们有一个视频文件input.mp4,我们可以使用以下命令将其转换为YUV420p格式的原始数据:
ffmpeg -i input.mp4 -pix_fmt yuv420p -an -vcodec rawvideo output.yuv
-pix_fmt yuv420p:指定输出像素格式为YUV420p。-an:关闭音频流,因为我们只关心视频数据。-vcodec rawvideo:指定视频编解码器为rawvideo,这意味着我们将输出未编码的原始视频数据。
2. 提取PCM数据
PCM(Pulse Code Modulation)是一种常见的未编码的音频数据格式。假设我们有一个音频文件input.mp3,我们可以使用以下命令将其转换为16位、44.1kHz、双声道的PCM数据:
ffmpeg -i input.mp3 -f s16le -ar 44100 -ac 2 output.pcm
-f s16le:指定输出文件的格式为16位小端(Little Endian)PCM数据。-ar 44100:指定音频的采样率为44.1kHz。-ac 2:指定音频的声道数为2(双声道)。
注意:提取的原始数据文件可能会非常大,因为它们包含了未经压缩的音视频数据。
11. FFmpeg转封装
转封装(Transcoding)是指改变媒体文件的封装格式,而不改变其音频和视频的编码。使用FFmpeg进行转封装非常简单,只需要指定输入和输出文件,然后让FFmpeg自动进行转封装。
例如,假设我们有一个MP4文件input.mp4,我们想要将其转封装为MKV格式,可以使用以下命令:
ffmpeg -i input.mp4 -codec copy output.mkv
在这个命令中:
-i input.mp4:指定输入文件。-codec copy:指示FFmpeg直接复制音频和视频的编解码数据,而不进行重新编码。output.mkv:指定输出文件的名字和格式。
这样,FFmpeg就会将input.mp4文件转封装为output.mkv,而不改变音视频的编码。
不是所有的音视频编码都可以被所有的封装格式支持。在进行转封装时,如果音视频编码不被目标封装格式支持,FFmpeg会报错。例如,MKV不支持ProRes编码,如果试图将一个包含ProRes编码的MOV文件转封装为MKV,FFmpeg会报错。在这种情况下,可能需要进行转码(改变音视频编码)而不是转封装。
12. FFmpeg命令裁剪和合成视频
FFmpeg具有强大的视频处理能力,包括裁剪和合并视频。以下是如何进行这些操作的方法:
-
裁剪视频
假设你希望从一个视频的第10秒开始,持续20秒,你可以使用
-ss和-t参数进行裁剪:ffmpeg -i input.mp4 -ss 00:00:10 -t 00:00:20 -c copy output.mp4在这个命令中:
-i input.mp4:指定输入文件。-ss 00:00:10:指定开始时间为第10秒。-t 00:00:20:指定持续时间为20秒。-c copy:指示FFmpeg直接复制音频和视频的编解码数据,而不进行重新编码。output.mp4:指定输出文件。
-
合并视频
FFmpeg可以将多个视频文件合并为一个。其中一个方法是多个文件用
“ | ”隔开,或者创建一个文本文件(例如filelist.txt),列出所有要合并的视频文件:file 'input1.mp4' file 'input2.mp4' file 'input3.mp4'然后,使用
concat协议进行合并:ffmpeg -f concat -i filelist.txt -c copy output.mp4在这个命令中:
-f concat:指示FFmpeg使用concat协议,这是用于合并视频的协议。-i filelist.txt:指定输入文件列表。-c copy:指示FFmpeg直接复制音频和视频的编解码数据,而不进行重新编码。output.mp4:指定输出文件。
注意:使用concat协议进行合并,所有的输入文件必须具有相同的编解码格式。如果输入文件不符合这个要求,需要先进行转码。建议把视频都转成TS封装格式再进行拼接,拼接时再转成需要的封装格式。拼接时,视频分辨率可以不同,但是编码格式需要统一。音频编码格式、采样率、声道等都要统一。
13. FFmpeg命令图片和视频互转
使用FFmpeg,可以将图片转换为视频,或者从视频中提取图片。下面是这些操作的基本方法:
1. 图片转视频
如果你有一系列的图片(例如,命名为img001.jpg, img002.jpg, img003.jpg...),你可以将它们合并为一个视频。以下是如何做到这一点的命令:
ffmpeg -f image2 -framerate 24 -i img%03d.jpg output.mp4
在这个命令中:
-f image2:指定输入格式为image2,这是FFmpeg用于处理图片序列的格式。-framerate 24:设置视频的帧率为24。-i img%03d.jpg:指定输入文件的模式,img%03d.jpg表示文件名是img开头,后面跟着3位数的数字,.jpg结束。output.mp4:指定输出文件。
GIF的生成和视频相似,只需要改后缀为gif即可。
2. 视频转图片
可以从视频中提取一系列的图片。以下是如何做的命令:
ffmpeg -i input.mp4 -t 5 -s 640x360 -vf fps=1 img%03d.jpg
在这个命令中:
-i input.mp4:指定输入文件。-t 5:输出5秒的图片。-s 640x360:指示输出图片的分辨率。-vf fps=1:设置过滤器,fps=1表示每秒输出一帧图片。img%03d.jpg:指定输出文件的模式,img%03d.jpg表示文件名是img开头,后面跟着3位数的数字,.jpg结束。
以上只是基本的图片和视频转换方法,FFmpeg提供了很多其他的选项和参数,可以根据需求进行调整。例如,可以指定输出视频的编解码器,或者设置输出图片的质量等。
14. FFmpeg命令视频录制
在Windows环境下,FFmpeg使用DirectShow(dshow)作为捕获设备,来进行视频录制。以下是使用dshow设备进行视频录制的基本步骤:
1. 列出可用的设备
可以使用以下命令来查看Windows系统中可用的音视频捕获设备:
ffmpeg -list_devices true -f dshow -i dummy
这个命令将会列出系统中所有可用的音频和视频设备,可以从中找到你想要使用的设备的名称。
2. 录制视频
找到设备名称后,就可以使用以下命令来进行视频录制了:
ffmpeg -f dshow -i video="Your Camera Name" output.mp4
在这个命令中:
-f dshow:指定输入格式为dshow,这是Windows中用于处理音视频设备的驱动。-i video="Your Camera Name":指定输入设备,Your Camera Name是你的摄像头的名称,你需要替换为你在第一步中找到的设备名称。output.mp4:指定输出文件。
3. 录制音频
如果还想同时录制音频,可以在命令中加入音频设备的名称:
ffmpeg -f dshow -i video="Your Camera Name":audio="Your Microphone Name" output.avi
在这个命令中,Your Microphone Name是麦克风的名称,需要替换为在第一步中找到的设备名称。如果只录音频不需要指定摄像头。
以上只是基本的录制命令,FFmpeg提供了很多其他的选项和参数,可以根据你的需求进行调整。例如可以设置录制的时长,或者在录制过程中对视频进行压缩等。
复杂命令解析:
ffmpeg -f dshow -i audio="麦克风(Realtek Audio)" -f dshow -i audio="virtual-audio-capturer" -filter_complex amix=inputs=2:duration=first:dropout_transition=2 -f dshow -video_size 1920x1080 -framerate 15 -pixel_format yuv420p -i video="screen-capture-recorder" -vcodec h264_qsv -b:v 3M -y av-out.flv
两个-f dshow -i audio指定了两路麦克风,-filter_complex amix=inputs=2:duration=first:dropout_transition=2指出用过滤器混合两路声音。-video_size 1920x1080指出了视频分辨率,-pixel_format yuv420p指定了像素格式,-vcodec h264_qsv指定了编码器,-b:v 3M表示码率设置为了3M。
15. FFmpeg命令直播
FFmpeg 可以从各种类型的流媒体服务器拉取流。最常见的应用场景包括从 RTSP、RTMP、HTTP、HLS 等协议的服务器拉取流。以下是一些常见的拉流命令示例:
1. 从 RTMP 服务器拉流:
ffmpeg -i rtmp://<server-ip>/<app>/<stream> -c copy output.flv
在这个命令中,你需要将 <server-ip>、<app> 和 <stream> 替换为你的 RTMP 服务器的实际地址、应用名和流名。
2. 从 RTSP 服务器拉流:
ffmpeg -i rtsp://<server-ip>/<stream> -c copy output.mkv
同样,你需要将 <server-ip> 和 <stream> 替换为你的 RTSP 服务器的实际地址和流名。
3. 从 HTTP 服务器拉流:
ffmpeg -i http://<server-ip>/<stream> -c copy output.mp4
这里你需要将 <server-ip> 和 <stream> 替换为你的 HTTP 服务器的实际地址和流名。
4. 从 HLS 服务器拉流:
ffmpeg -i http://<server-ip>/<stream>.m3u8 -c copy output.ts
在这个命令中,你需要将 <server-ip> 和 <stream> 替换为你的 HLS 服务器的实际地址和流名。请注意,HLS 流通常使用 .m3u8 文件进行索引,所以你需要包含这个后缀。
在以上所有命令中,-i 选项用于指定输入流,-c copy 选项用于指定编码器(在这里我们使用 copy 来表示不进行重新编码,直接复制原始流),而 output.<extension> 是输出文件的名称和格式。
还可以使用 FFmpeg 进行推流直播,一般的步骤如下:
- 准备直播源:直播源可以是一个视频文件,也可以是一个实时的视频捕获设备(例如,摄像头)。如果你正在使用一个视频文件作为直播源,你需要确保这个文件的格式是 FFmpeg 支持的格式。
- 选择直播协议:有许多协议可以用于直播,例如 RTMP、HLS、MPEG-DASH 等。你需要选择一个适合你的应用场景的协议。
- 设置直播服务器:需要一个服务器来接收直播流并将其分发给观众。这个服务器可以是一个公共的直播服务,例如 YouTube Live 或 Twitch,也可以是自己搭建的私有服务器。
以下是一个使用 RTMP 协议进行直播的基本命令:
ffmpeg -re -i input.mp4 -c:v libx264 -preset veryfast -b:v 3000k -maxrate 3000k -bufsize 6000k -vf "format=yuv420p" -g 50 -c:a aac -b:a 160k -ac 2 -ar 44100 -f flv rtmp://live.twitch.tv/app/<stream_key>
在这个命令中:
-re是一个输入选项,它会使 FFmpeg 以实时速度读取输入流。这对于直播来说是非常重要的,因为它会防止 FFmpeg 过快地读取输入并耗尽所有的带宽。-i input.mp4指定了输入文件。你需要将input.mp4替换为你的视频文件的名称。-c:v libx264和-c:a aac指定了视频和音频的编码器。在这个例子中,我们使用的是 H.264 视频编码器和 AAC 音频编码器。-preset veryfast、-b:v 3000k、-maxrate 3000k、-bufsize 6000k这些选项用于控制视频的质量和带宽使用。-vf "format=yuv420p"是一个视频过滤器,它将视频转换为 YUV 4:2:0 格式。这是大多数直播平台所需要的格式。-g 50设置了关键帧间隔。这可以帮助视频在丢帧时恢复。-b:a 160k、-ac 2、-ar 44100这些选项用于控制音频的质量。-f flv指定了输出格式。对于 RTMP 流,这通常是 FLV 格式。rtmp://live.twitch.tv/app/<stream_key>是你的直播服务器的地址。你需要将<stream_key>替换为你的实际的流密钥。
以上命令仅仅是一个基本的例子,实际上,可能需要根据你的实际情况来调整这些参数,例如视频和音频的质量、带宽使用等等。此外,如果正在使用其他的直播协议或服务器,也可能需要修改输出格式和服务器地址。
16. FFmpeg命令filter过滤器
在 FFmpeg 中,filter 是一种用于处理音频或视频数据的工具。它们可以用于实现各种各样的效果,例如裁剪视频、调整颜色、添加水印、改变播放速度等等。
使用 filter 的基本命令是 -vf(用于视频)和 -af(用于音频)。这些选项后面跟的是你想要应用的过滤器及其参数。下面是一些基本过滤器。
裁剪(crop)
裁剪过滤器可以用来减小视频帧的大小。基本用法如下:
ffmpeg -i input.mp4 -vf "crop=out_w:out_h:x:y" output.mp4
其中,out_w 和 out_h 是输出的宽度和高度,x 和 y 是裁剪区域左上角的坐标。例如,要从视频的中心裁剪出一个 200x200 的区域,可以这样写:
ffmpeg -i input.mp4 -vf "crop=200:200:(in_w-200)/2:(in_h-200)/2" output.mp4
crop也可以用于裁剪图片。
文字水印(drawtext)
drawtext 过滤器可以用来在视频上添加文字。基本用法如下:
ffmpeg -i input.mp4 -vf "drawtext=text='Hello World':fontfile=/path/to/font.ttf:fontsize=24:fontcolor=white:x=(w-text_w)/2:y=(h-text_h)/2" output.mp4
这个命令将在视频的中心添加一个文字 "Hello World"。fontfile 参数是你的字体文件的路径,fontsize 是字体大小,fontcolor 是字体颜色,x 和 y 是文字左上角的坐标。可以通过一些方式使得水印在屏幕上移动,可参考网上案例。
图片水印(overlay)
overlay 过滤器可以用来在视频上添加图片,通常用于添加水印。基本用法如下:
ffmpeg -i input.mp4 -i watermark.png -filter_complex "overlay=W-w-10:H-h-10" output.mp4
这个命令将把 watermark.png 添加到视频的右下角,与边缘的距离为 10 像素。
画中画(overlay)
overlay 过滤器也可以用来实现画中画效果。例如可以用下面的命令将一个小视频放到主视频的右下角:
ffmpeg -i main.mp4 -i small.mp4 -filter_complex "[0:v][1:v] overlay=W-w-10:H-h-10:format=auto,format=yuv420p" output.mp4
多宫格(xstack)
xstack 过滤器可以用来将多个视频并排显示。例如可以用下面的命令将两个视频并排显示:
ffmpeg -i input1.mp4 -i input2.mp4 -filter_complex "[0:v][1:v]xstack=inputs=2:layout=0_0|w0_0[v]" -map "[v]" output.mp4
这个命令将把 input1.mp4 和 input2.mp4 并排显示。layout 参数定义了每个视频的位置。