ffmpeg

ffmpeg命令用于录制、编辑、转码视频。

1.1、查看当前系统中的支持音视频的设备
ffmpeg -devices

这个结果在不同的系统中会不一样。

macOS中的结果通常如下:

2、查看某种设备有哪些具体的设备:

ffmpeg -list_devices true -f ${DeviceName} -i ""

${DeviceName}是变化的,通常与操作系统有关:

操作系统DeviceName
macOSavfoundation
Windowsdshow
GNU/Linuxx11grab
1.2、录制

示例1:

ffmpeg -f avfoundation -r 30 -i "0" -aspect 1:1 -s 480x480 output.mp4

命令解释:

-f avfoundation表明是在macOS中的avfoundation设备。

-i "0"表示捕获摄像头的数据。

-r 30表示视频的帧率,这里是30帧/秒。-i "0"的位置不能与-r 30互换。

-aspect 1:1是设置生成的视频的宽度:高度的比例。

-s 480x480是设置生成的视频的具体分辨率。

output.mp4就是保存的文件名称,也可以是路径。

示例2:

ffmpeg -f avfoundation -i "0" -target pal-vcd output.mp4

命令解释:

-f avfoundation表明是在macOS中的avfoundation设备。

-i "0"表示捕获摄像头的数据。

-target pal-vcd表示生成pal标准的VCD能够播放的视频文件。target就是表示要生成某种标准的VCDDVD等能够播放的视频。

1.3、推流
1.3.1、捕获屏幕数据,并推流
ffmpeg -f avfoundation -i "1" -vcodec libx264 -preset ultrafast -acodec libfaac -f flv rtmp://localhost:1935/stream/fpliu

命令解释:

-f avfoundation表明是在macOS中的avfoundation设备。

-i "1"表示捕获显示器的数据。

-vcodec libx264表示视频使用x264进行编码,这是软编码。

-presetx264的参数, 其值可以是fast/faster/verfast/superfast/ultrafast-preset ultrafast这样设置之后,延迟比较低,但是图像质量可能会比较差。

-acodec libfaac表示音频使用libfaac进行编码,这是软编码。

-f flv表示输出的视频的封装格式是FLV

rtmp://localhost:1935/stream/fpliu这是推流地址。

1.3.2、捕获屏幕+麦克风的数据,并推流
ffmpeg -f avfoundation -i "1:0" -vcodec libx264 -preset ultrafast -acodec libmp3lame -ar 44100 -ac 1 -f flv rtmp://localhost:1935/stream/fpliu

命令解释:

-f avfoundation表明是在macOS中的avfoundation设备。

-i "1:0"表示捕获显示器和麦克风的数据。

-vcodec libx264表示视频使用x264进行编码,这是软编码。

-presetx264的参数, 其值可以是fast/faster/verfast/superfast/ultrafast-preset ultrafast这样设置之后,延迟比较低,但是图像质量可能会比较差。

-acodec libmp3lame表示音频使用lame进行编码,这是软编码。

-ar 44100表示音频采样率是44.1kHz

-ac 1表示音频的通道数量是1,也就是单声道。

rtmp://localhost:1935/stream/fpliu这是推流地址。

1.3.3、捕获屏幕+麦克风+摄像头的数据,并推流
ffmpeg -f avfoundation -framerate 30 -i "1:0" \
       -f avfoundation -framerate 30 -video_size 640x480 -i "0" \
       -c:v libx264 -preset ultrafast \
       -filter_complex 'overlay=main_w-overlay_w-10:main_h-overlay_h-10' \
       -acodec libmp3lame -ar 44100 -ac 1  -f flv \
       rtmp://localhost:1935/stream/fpliu

命令解释:

-f avfoundation表明是在macOS中的avfoundation设备。

-i "1:0"表示捕获显示器和麦克风的数据。

-vcodec libx264表示视频使用x264进行编码,这是软编码。

-presetx264的参数, 其值可以是fast/faster/verfast/superfast/ultrafast-preset ultrafast这样设置之后,延迟比较低,但是图像质量可能会比较差。

-acodec libmp3lame表示音频使用lame进行编码,这是软编码。

-ar 44100表示音频采样率是44.1kHz

-ac 1表示音频的通道数量是1,也就是单声道。

rtmp://localhost:1935/stream/fpliu这是推流地址。

1.3.4、捕获视频采集卡的数据,并推流

对游戏机的画面进行直播、对摄像机拍摄的数据进行现场直播,都需要借助视频采集卡,视频采集卡对于电脑来说,就是一种输入设备。

1.3.5、用视频文件推流

示例:

ffmpeg -re -i input.mp4 -vcodec copy -acodec copy -f flv -y rtmp://localhost:1935/stream/fpliu

命令解释:

-re表示按照帧率发送,否则会一股脑地按最高的效率发送数据。

-i input.mp4表示指定输入文件。

-vcodec copy表示视频流的视频编码格式与-i input.mp4指定的输入文件中的视频编码一样。

-acodec copy表示视频流的音频编码格式与-i input.mp4指定的输入文件中的音频编码一样。

-f flv表示视频流使用FLV封包格式。

-y表示覆盖流,如果已经存在的话。

rtmp://localhost:1935/stream/fpliu是推流地址。

1.4、拉流

示例1 - 把RTMP流保存成文件:

ffmpeg -i rtmp://58.200.131.2:1935/livetv/hunantv -vcodec h264 -acodec aac -ac 2 -f mp4 output.mp4

命令解释:

-i rtmp://58.200.131.2:1935/livetv/hunantv是指定流地址。

-vcodec h264表示生成的视频文件中的视频采用H.264编码。

acodec aac表示生成的视频文件中的音频采用AAC编码。

-f mp4表示生成的视频文件使用MP4封包格式。

-ac 2表示音频的通道数量是2,也就是双声道。

output.mp4是生成的视频文件的路径。

1.5、转流

示例:

ffmpeg -i rtsp://184.72.239.149/vod/mp4://BigBuckBunny_175k.mov -rtsp_transport tcp -vcodec h264 -acodec aac -f flv rtmp://localhost:1935/stream/fpliu
1.6、转码
1.6.1、avi -> ts

示例:

ffmpeg -i input.avi -b:v 640k output.ts
1.6.2、flv -> mp4

示例:

ffmpeg -i input.flv output.mp4
1.7、抽取视频

示例:

ffmpeg -i input.mp4 -an output.mp4

命令解释:

-i input.mp4是指定输入文件。

-anno audio的意思,就是不包含音频。

1.8、抽取音频

示例:

ffmpeg -i input.mp4 -vn output.mp4

命令解释:

-i input.mp4是指定输入文件。

-vnno video的意思,就是不包含视频。

1.9、设置比特率

一个视频文件中可以包含视频流音频流,可以分别对他们设置比特率。

设置视频中视频流的比特率使用-b:v VALUE或者-b VALUE

设置视频中音频流的比特率使用-b:a VALUE或者-ab VALUE

VALUE的单位是bit/s

示例:

ffmpeg -i input.mp4 -b:v 2000k output.mp4
ffmpeg -i input.mp3 -b:a 96 output.mp3
1.10、从视频中截图

示例:

ffmpeg -i input.mp4 -f image2 -ss 5 -t 0.01 -s 480x320 test.jpg

命令解释:

-i input.mp4是指定输入文件。

-f image2是指定输入的图片文件的格式。

-ss 5表示定位到指定的时间,单位是秒,本例子中表示是从第5秒处截图。-ss VALUE后面也可以跟[-]hh:mm:ss[.xxx]格式化的时间。

-t 0.01表示采样时间。

-s 480x320是指定输出的图片的分辨率(宽度x高度)。

1.11、对视频进行切片

示例:

ffmpeg -i input.mp4 -strict -2 -c:v libx264 -c:a aac -f hls output.m3u8

命令解释:

-i input.mp4是指定输入文件。

-strict -2是指定跟标准的严格性。

-c:v libx264是指定输出视频中的视频流的编码格式为H.264。

-c:a aac是指定输出视频中的音频流的编码格式为AAC。

-f hls是指定输出格式。

1.12、多张图片合成视频

示例:

ffmpeg -threads 2 -y -r 10 -i image%04d.jpg -i audio.mp3 -absf aac_adtstoasc output.mp4

命令解释:

-threads 2是指以两个线程进行运行,加快处理的速度。

-y是指对输出文件进行覆盖,如果存在的话。

-r 10是设置帧率为10帧/秒。

-i image%04d.jpg是指定输入的图片文件的名称以image开头,随后是4位阿拉伯数字,后缀名是.jpg

-i audio.mp3是指定音频流。

-absf aac_adtstoasc将结果的音频格式转为AAC格式时需要这个选项。 将音频格式转为AAC是因为在iPhone上某些音频格式的视频无法播放,例如mp3,但AAC格式的音频的视频在iPhone上可以播放。-absf的意思是设置一个Bitstream filter进行某些转换。 可以用ffmpeg -bsfs查看所有支持的Bitstream filter