Bootstrap

从事【音视频】的开发者,看过来,如果记不住FFmepg命令,可以收藏,不记得的时候,掏出来翻翻

大概分为6个部分,具体如下:

  • ffmpeg信息查询部分

  • 公共操作参数部分

  • 文件主要操作参数部分

  • 视频操作参数部分

  • 音频操作参数部分

  • 字母操作参数部分

查看支持的容器格式

# 封装和解封装
ffmpeg -formats
# 解封装
ffmpeg -demuxers
# 封装
ffmpeg -muxers
# 查看FLV封装器的参数支持
ffmpeg -h muxer=flv
# 查看FLV解封装器的参数支持
ffmpeg -h demuxer=flv

查看支持的编解码格式

# 编解码
ffmpeg -codecs
# 解码
ffmpeg -decoders
# 编码
ffmpeg -encoders
# 查看H.264(AVC)的编码参数支持
ffmpeg -h encoder=h264
# 查看H.264(AVC)的解码参数支持
ffmpeg -h decoder=h264

查看支持的滤镜

# 滤镜
ffmpeg -filters
# 查看colorkey滤镜的参数支持
ffmpeg -h filter=colorkey

转码

ffmpeg -i WMV9_1280x720.wmv -vcodec mpeg4 -b:v 200 -r 15 -an output.mp4 
# -i 文件 (后缀名)封装格式
# -vcodec 视频编码格式
# -b:v 视频码率
# -r 视频帧率
# -an 不包括音频

ffprobe常用命令

查看多媒体数据包信息

查看多媒体的封装格式

查看视频文件中的帧信息

查看多媒体文件中的流信息

或 格式化输出支持XML、INI、JSON、CSV、FLAT等

ffplay

可视化

Visualize information exported by some codecs.

ffmpeg -h filter=codecview
  • Visualize forward predicted MVs of all frames using

    ffplay -flags2 +export_mvs input.mp4 -vf codecview=mv_type=fp

  • Visualize multi-directionals MVs of P and B-Frames using

    ffplay -flags2 +export_mvs input.mp4 -vf codecview=mv=pf+bf+bb

ffmpeg转封装格式

  • 需要知道 源容器目标容器 的可容纳的编码格式

  • 编码格式如果相互兼容,可以用拷贝原有的stream

  • 编码格式如果不兼容,需要转化成目标文件支持的编码

HLS

如果源文件为FLV、TS等可以作为直播传输流的视频,则不需要这个参数。

音视频文件音视频流抽取

h264转h265(HEVC)

ffmpeg -i input.mp4 -c:v libx265 -vtag hvc1 h265_output.mp4

aac转MP3(需要安装libmp3lame)

ffmpeg -i AVC_high_1280x720_2013.mp4 -vn -acodec libmp3lame -f mp3 out.mp3

x264

安装

$git clone git://git.videolan.org/x264.git
$cd x264
$./configure –enable-shared 
$make
$sudo make install

查看

x264 --full help

设置编码参数

MP3/AAC

ffmpeg流媒体

ffmpeg发布与录制RTMP流

FFmpeg操作RTMP的参数

FFmpeg操作RTSP的参数

ffmpeg -rtsp_transport tcp -i rtsp://127.0.0.1/test.mkv -c copy -f mp4 output.mp4

FFmpeg操作HTTP的参数

FFmpeg录制和发布TCP与UDP流

FFmpeg推多路流

ffmpeg滤镜使用

FFmpeg滤镜Filter描述格式

  • 滤镜

    ffmpeg -h filter=drawtext # 文字水印 ffmpeg -i input.mp4 -ss 50 -vf "drawtext=fontsize=100:fontfile=/usr/share/fonts/truetype/freefont/FreeSerif.ttf :text='Hello World':fontcolor='yellow':x=20:y=20" output.mp4 # 动态日期 ffmpeg -i input.mp4 -ss 50 -vf "drawtext=fontsize=100:fontfile=/usr/share/fonts/truetype/freefont/FreeSerif.ttf :text='%{localtime\:%Y\-%m\-%d %H-%M-%S}':fontcolor='yellow':x=20:y=20" output.mp4 # 闪烁 ffmpeg -i input.mp4 -ss 50 -vf "drawtext=fontsize=100:fontfile=/usr/share/fonts/truetype/freefont/FreeSerif.ttf :text='%{localtime\:%Y\-%m\-%d %H-%M-%S}':fontcolor='yellow':x=20:y=20:enable=lt(mod(t\,3)\,1)" output.mp4

  • 滤镜

    # 图片水印 ffmpeg -i input.mp4 -vf "movie=logo.png[wm];[in][wm]overlay=30:10[out]" output.mp4 # colorkey 半透明 ffmpeg -i input.mp4 -ss 55 -vf "movie=../picture/3d_data.png,colorkey=black:1.0:0.1[wm];[in][wm]overlay=30:10[out]" output.mp4

  • 滤镜

    # 画中画 ffmpeg -re -i input.mp4 -vf "movie=sub.mp4,scale=480x320[test];[in][test]overlay[out]" -vcodec libx264 output.flv # 跑马灯 ffmpeg -re -i input.mp4 -vf "movie=sub.wmv,scale=480x320[test];[in][test]overlay=x='if(gte(t,2), -w+(t-2)*50, NAN)':y=0[out]" -vcodec libx264 output.flv # 视频多宫格处理 ffmpeg -i input1.mp4 -i input2.mp4 -i input3.mp4 -i input4.mp4 -filter_complex " nullsrc=size=1280x720 [background]; [0:v] setpts=PTS-STARTPTS, scale=640x360 [upleft]; [1:v] setpts=PTS-STARTPTS, scale=640x360 [upright]; [2:v] setpts=PTS-STARTPTS, scale=640x360 [downleft]; [3:v] setpts=PTS-STARTPTS, scale=640x360 [downright]; [background][upleft] overlay=shortest=1 [background+upleft]; [background+upleft][upright] overlay=shortest=1:x=640 [background+up]; [background+up][downleft] overlay=shortest=1:y=360 [background+up+downleft]; [background+up+downleft][downright] overlay=shortest=1:x=640:y=360 " output.mp4

FFmpeg音频流滤镜操作

不常用,大多数播放器也只会播放第一个流

FFmpeg为视频加字母

FFmpeg视频抠图合并

FFmpeg 3D视频处理

  • stereo3d

    滤镜

    # 黄蓝 ffplay -vf "stereo3d=sbsl:aybd" AVC_high_1280x720_2013.mp4 # 红蓝 ffplay -vf "stereo3d=sbsl:aybg" AVC_high_1280x720_2013.mp4

FFmpeg定时视频截图

  • 参数截取一张图片

  • fps

    滤镜定时获得图片

    # 每隔1秒钟生成一张PNG图片 ffmpeg -i input.flv -vf fps=1 out%d.png # 每隔一封中生成一张jpg图片 ffmpeg -i input.flv -vf fps=1/60 out%d.jpg # select 按照关键帧截取图片 ffmpeg -i input.flv -vf "select='eq(pict_type,PICT_TYPE_I)'" -vsync vfr thumb%04d.png

FFmpeg 生成测试源数据

FFmpeg对音视频倍速处理

ffmpeg采集设备

其他

x265安装

DTS、PTS 的概念

DTS、PTS 的概念如下所述:

  • DTS(Decoding Time Stamp):即解码时间戳,这个时间戳的意义在于告诉播放器该在什么时候解码这一帧的数据。

  • PTS(Presentation Time Stamp):即显示时间戳,这个时间戳用来告诉播放器该在什么时候显示这一帧的数据。

需要注意的是:虽然 DTS、PTS 是用于指导播放端的行为,但它们是在编码的时候由编码器生成的。

当视频流中没有 B 帧时,通常 DTS 和 PTS 的顺序是一致的。但如果有 B 帧时,就回到了我们前面说的问题:解码顺序和播放顺序不一致了。

比如一个视频中,帧的显示顺序是:I B B P,现在我们需要在解码 B 帧时知道 P 帧中信息,因此这几帧在视频流中的顺序可能是:I P B B,这时候就体现出每帧都有 DTS 和 PTS 的作用了。DTS 告诉我们该按什么顺序解码这几帧图像,PTS 告诉我们该按什么顺序显示这几帧图像。顺序大概如下:

   PTS: 1 4 2 3
   DTS: 1 2 3 4
Stream: I P B B

其他常用命令

1、将文件当作源推送到RTMP服务器

ffmpeg -re -i localFile.mp4 -c copy -f flv rtmp://server/live/streamName

参数解释 -r 以本地帧频读数据,主要用于模拟捕获设备。表示ffmpeg将按照帧率发送数据,不会按照最高的效率发送

2、将直播文件保存至本地

ffmpeg -i rtmp://server/live/streamName -c copy dump.flv

3、将其中一个直播流中的视频改用H.264压缩,音频不变,推送到另外一个直播服务器

ffmpeg -i rtmp://server/live/originalStream -c:a copy -c:v libx264 -vpre slow -f flv rtmp://server/live/h264Stream

4、将其中一个直播流中的视频改用H.264压缩,音频改用aac压缩,推送到另外一个直播服务器

ffmpeg -i rtmp://server/live/originalStream -c:a libfaac -ar 44100 -ab 48k -c:v libx264 -vpre slow -vpre baseline -f flv rtmp://server/live/h264Stream

5、将其中一个直播流中的视频不变,音频改用aac压缩,推送到另外一个直播服务器

ffmpeg -i rtmp://server/live/originalStream -acodec libfaac -ar 44100 -ab 48k -vcodec copy -f flv rtmp://server/live/h264_AAC_Stream

6、将一个高清流复制为几个不同清晰度的流重新发布,其中音频不变

ffmpeg -re -i rtmp://server/live/high_FMLE_stream -acodec copy -vcodec x264lib -s 640×360 -b 500k -vpre medium -vpre baseline rtmp://server/live/baseline_500k -acodec copy -vcodec x264lib -s 480×272 -b 300k -vpre medium -vpre baseline rtmp://server/live/baseline_300k -acodec copy -vcodec x264lib -s 320×200 -b 150k -vpre medium -vpre baseline rtmp://server/live/baseline_150k -acodec libfaac -vn -ab 48k rtmp://server/live/audio_only_AAC_48k

7、将当前摄像头以及扬声器通过DSHOW采集,使用H.264/AAC压缩后推送到RTMP服务器

ffmpeg -r 25 -f dshow -s 640×480 -i video=”video source name”:audio=”audio source name” -vcodec libx264 -b 600k -vpre slow -acodec libfaac -ab 128k -f flv rtmp://server/application/stream_name

8、将一个JPG图片经过H.264压缩后输出为MP4文件

ffmpeg -i INPUT.jpg -an -vcodec libx264 -coder 1 -flags +loop -cmp +chroma -subq 10 -qcomp 0.6 -qmin 10 -qmax 51 -qdiff 4 -flags2 +dct8x8 -trellis 2 -partitions +parti8x8+parti4x4 -crf 24 -threads 0 -r 25 -g 25 -y OUTPUT.mp4

9、将MP3转化为AAC

ffmpeg -i 20120814164324_205.wav -acodec  libfaac -ab 64k -ar 44100  output.aac

10、将AAC文件转化为flv文件,编码格式采用AAC

ffmpeg -i output.aac -acodec libfaac -y -ab 32 -ar 44100 -qscale 10 -s 640*480 -r 15 outp

本文涉及的资料全部打包放到我Github仓:

有需要的可以前去下载,或者觉得还不错,请给我Star,感谢支持!