FFmpeg从入门到精通命令

第二章 工作使用基础

  • ffmpeg使用及部分参数
  • ffprobe 使用及部分参数
  • ffplay 使用及部分参数

第三章 ffmpeg转封装

  • MP4
    • box容器一个套一个
    • ffmpeg -h demuxer=mp4
    • mp4分析工具
  • FLV
    • flv 头和tag
    • flv分析工具
  • M3U8
    • -bsf: v h264_mp4toannexb MP4中的h264 数据转换为h.264 Annexb标准的编码,如果源文件为FLV,TS等可作为直播传输流的视频。
    • 设置M3U8切片的参数
  • 视频文件的切片
    • segment
    • ss与t
  • 音视频文件音视频流抽取
    • an vn
  • 资源使用情况
    • ffmpeg 进行封装转化时并不会占用大量的CPU资源,主要以读取音视频数据,写入音视频数据为主,不会涉及复杂的计算。进行编码会进行大量的计算

第四章 ffmpeg转码

  • 1.软编码H.264 和H.265
    • OpenH264开源比较晚,x264为主
    • 像素
      • yuv420p,yuvj420p,yuv422p,yuvj422p,yuv444p,yuvj444p,nv12,nv16,nv21
      • ffmpeg -h encoder=libx264
    • x264 编码参数
      • 1.preset-118页 编码参数设置 最快-> 最慢
        • 所设参数不同,编码出来的清晰度也有所不同,方便操作,直接设置preset即可
        • 速度快 画质不好 马赛克,反之画质则优
      • 2.tune-122 编码优化参数
        • 进行h264直播编码推流时,只用tune参数的zerolatency 将会提升效率,因为其降低了因编码导致的延迟。
      • 3.123-profilelevel
        • 例子 使用baseline 不包含B Slice
          • ffmpeg -i input.mp4 -vcodec libx264 -profile:v baseline -level 3.1 -s 352X288 -an -y -t 10 output_baseline.ts
          • ffprobe -v quiet -show_frame -select_stream v output_baseline.ts | grep "pict_type=B"|wc -l 等于0
        • 例子 high 的profile 包含B slice
          • ffmpeg -i input.mp4 -vcodec libx264 -profile:v high -level 3.1 -s 352X288 -an -y -t 10 output_high.ts
          • ffprobe -v quiet -show_frame -select_stream v output_high.ts | grep "pict_type=B"|wc -l 等于140
        • 总结: 当进行实时流媒体直播时,采用baseline编码相对main 和 high的profile会更可靠些;但是适当的加入B帧能够有效地降低码率。
      • 4.sc_threshold 场景切换是否插入是否插入关键帧,可以控制关键帧
        • 因为在场景切换,一个画面突然变成另一个画面,会强行插入一个关键帧,这时GOP的间隔将会重新开始。
        • 例子 场景切换不插入关键帧
          • ffmpeg -i input.mp4 -c:v libx264 -g 50 -sc_threshold 0 -t 60 -y output.mp4
      • 5.设置x264内部参数 x264opts
        • 例1 GOP设置50帧 在这50帧里不希望出现B帧
          • ffmpeg -i input.mp4 -c:v libx264 -x264opts "bframes=0" -g 50 -sc_threshold 0 output.mp4
        • p帧的频率可以通过x264的参数b-adapt进行设置
        • 例2 每2个P帧之间存放3个B帧
          • ffmpeg -i input.mp4 -c:v libx264 -x264opts "bframes=3:b-adapt=0" -g 50 -sc_threshold 0 output.mp4
        • 总结: 视频中B帧越多,‘同等码率时’的清晰度将会越高,但是B帧越多,编码与解码所带来的复杂度也就越高
      • 6.CBR恒定码率设置参数nal-hrd
        • 1.编码能够设置VBR、CBR编码模式,VBR为可变码率,CBR为恒定码率。
        • 2.ffmpeg 通过参数-b:v指定视频的编码码率的,但是设定的是平均码率,并不能很好的控制最大码率及最小码率的波动,如果需要控制则需要ffmpeg的三个参数 -b:v、maxrate、minrate、buffer。
        • 3.例子1
          • ffmpeg -i input.mp4 -c:v libx264 -x264opts "bframes=10:b-adapt=0" -b:v 1000k -maxrate 1000k -minrate 1000k -buffsize 50k -nal-hrd cbr -g 50 -sc_threshold 0 output.ts
            • 设置B帧的个数,每两个P帧之间包含10个B帧
            • 设置视频码率为1000kbit/s
            • 设置最大码率为1000kbit/s
            • 设置最小码率为1000kbit/s
            • 设置编码的buffer大小为50KB
            • 设置H264的编码HRD信号形式为CBR
            • 设置每50帧一个GOP
            • 设置场景切换不强行插入关键帧
          • 工具:Bitrate Viewer 码率波动效果;Elecard StreamEye 查看视频流信息。
    • 总结: 当使用ffmpeg进行软编码时,常见的基于CPU进行h.264或h.265编码其相对成本会比较高,CPU编码时性能也很低,基于编码效率及成本考虑,很多时候会使用硬编码。
    1. ffmpeg 硬编解码
    • NVIDIA GPU硬编解码
        1. Nvidia硬编码参数 ffmpeg -h encoder=h264_nvenc
      • 2.编码参数使用举例。查看支持的像素格式ffmpeg -h encoder=h264_nvenc, ffmpeg -h decoder=h264_cuvid
        • ffmpeg -hwaccel cuvid -vcodec h264_cuvid -i input.mp4 -vf scale_npp=1920:1080 -vcodec h264_nvenc -acodec copy -f mp4 -y output.mp4
          • -hwaccel 匹配硬件加速解码流
          • cuvid h264_cuvid解码 h264_nvenc 编码
    • Intel QSV h.264使用
      • 支持的像素 nv12 、qsv
      • 例1
        • ffmpeg -i 10M1080p.mp4 -pix_fmt nv12 -vcodec h264_qsv -an -y output.mp4
      • Intel QSV h.265
      • 例2
        • ffmpeg -hide_banner -y -hwaccel qsv -i 10M1080p.mp4 -an -c:v hevc_qsv -load_plugin hevc_hw -b:v 5M -maxrate 5M out.mp4
    • 树莓派硬编码
      • –enable-omx-rpi ffmpeg -h encoder=h264_omx
      • 例1
        • ffmpeg -i input.mp4 -vcodec h264_omx -b:v 500k -acodec copy -y output.mp4
    • OSX 系统硬编解码
      • 硬编码h264_videotoolbox(VBR/ABR,不支持CBR模式),硬解码采用h264_vda
      • OS X 硬编解码参数
      • 例1
        • ffmpeg -vcodec h264_vda -i input.mp4 -vcodec h264_videotoolbox -b:v 2000k output.mp4
  • 3.ffmpeg 输出MP3
    • 采样格式(s32p(signed 32 bits,planer), fltp(float, planar), s16p(signed 16 bits, planar)多种格式),声道布局方式支持mono(单声道模式),stereo(环绕立体声模式)
    • 1.MP3参数介绍 ffmpeg -h encoder=libmp3lame
    • 2.编码质量设置
      • 控制质量通过 -qscale:a 进行控制,或者使用q,质量不同,码率不同。
      • 例1 码率会出现不断的变化,这是因为为VBR模式,CBR则不会
        • ffmpeg -i input.mp3 -acodec libmp3lame -q:a 8 output.mp3
      • 例2 -b CBR 几乎不会出现波动
        • ffmpeg -i input.mp3 -acodec libmp3lame -b:a 64k output.mp3
    • 3.平均码率编码参数ABR
      • ABR是VBR和CBR的混合产物,标识平均码率产物,使用ABR参数之后,编码速度比VBR高,质量比VBR稍差一些,比CBR编码好一些,使用 -abr 控制
        • 例子
          • ffmpeg -i input.mp3 -acodec libmp3lame -b:a 64k -abr 1 output.mp3
      1. ffmpeg 输出AAC
      • 1.aac 编码效率更高、编码音质更好
      • 2.支持AAC三种编码器
        • a. aac ffmpeg 本身的AAC编码实现
        • b. libfaac 第三方AAC 编码器 非GPL协议 nonfree
        • c. libfdk_aac 第三方AAC编码器 非GPL协议 nonfree

第五章 ffmpeg流媒体

  • 1.ffmpeg 发布与录制RTMP 流
    • 1.参数说明
    • 2参数举例
        1. rtmp_app
        • ffmpeg -rtmp_app live -i rtmp://publish.chinaffmpeg.com -c copy -f flv output.flv
        • ffmpeg -re -i input.mp4 -c copy -f flv -rtmp_app live rmtp://publish.chinaffmpeg.com
          • Server error: identify stream failed 尚未设置stream项所致
        1. rtmp_playpath
        • 解决 identify stream failed,rtmp_app rtmp_playpath
          *推流 ffmpeg -re -i input.mp4 -c copy -f flv -rtmp_app live -rtmp_playpath class rtmp://publish.chinaffmpeg.com
        • 拉流./ffmpeg -rtmp_app live -rtmp_playpath class -i rtmp://publish.chinaffmpeg.com -c copy -f flv output.flv
        • 代替推流 ./ffmpeg -i input.mp4 -c copy -f flv rtmp://publish.chinaffmpeg.com/live/class
        • 代替拉流 ./ffmpeg -i rtmp://publish.cinaffmpeg.com/live/class -c copy -f flv output.flv
        1. rtmp_pageurl, rtmp_swfurl, rtmp_tcurl 参数
    1. ffmpeg 录制RTSP流
    • 1.RTSP参数说明
    • 2.RTSP参数使用举例
      • 1.采用udp方式时长会导致拉流丢包出现异常,所有采用tcp
      • 2.TCP方式录制RTSP直播流
        • 拉流录制 ./ffmpeg -rtsp_transport tcp -i rtsp://47.90.47.25/test.ts -c copy -f mp4 output.mp4
        • 抓包查询RTSP服务器所支持的方法包含的内容,支持OPTION,DESCRIBE ,SETUP,TEARDOWN,PLAY,PAUSE,GET_PARAMETER,SET_PARAMETER。
        1. User-Agent设置参数 区分是否自己访问的流
        • ./ffmpeg -user-agent "ChinaFFmpeg-Play" -i rtsp://input:554/live/1/stream.sdp -c copy -f mp4 -y output.mp4
        • 加上User-Agent 判断是否为本次访问
    1. ffmpeg录制http流
    • 1.http 参数说明
    • 2.http参数使用举例
      • 1.ffmpeg的http既可以作为客户端使用,也可以作为服务器使用。
      • 2.客户端举例
        • 1.seekable 参数举例
          • 1)可以通过seek操作进行播放进度移动,定位等。
          • 2)ffmpeg -ss 300 -seekable 0 -i http://bbs.chinaffmpeg.com/test.ts -c copy output.mp4
            • 说明:seekable 设置为0,则ffmpeg 的参数ss指定seek的时间位置。因为seekable参数是0,所以会一直处于 阻塞状态
          • 3)ffmpeg -ss 30 -seekable 1 -i http://bbs.chinaffmpeg.com/test.ts -c copy -y output.mp4
            • 说明:因为seekable设置为1,ffmpeg可以对http服务进行seek操作,自然不会出现任何异常。
        • 2.headers 参数
          • 1)在header中设置referer字段,
          • 2)ffmpeg -headers "referer: http://bbs.chinaffmpeg.com/index.html" -i http://play.chinaffmpeg .com/live/class.flv -c copy -f flv -y output.flv
        • 3.user_agent
            1. ffmpeg 连接http时,为了区分ffmpeg是自己的,可以通过参数uase_agent 设置
            • ffmpeg -user_agent "LiuQi's Player" -i http://bbs.chinaffmpeg.com/1.flv
      1. HTTP 拉流录制
    • 4.拉去HTTP中的流录制FLV
        1. 拉去flv直播流录制 为FLV:ffmpeg -i http://bbs.chinaffmpeg.com/live.flv -c copy -f flv output.flv
      • 2.拉去TS直播流录制为FLV:ffmpeg -i http://bbs.chinaffmpeg.com/live.ts -c copy -f flv output.flv
      • 3.拉去HLS直播流录制为FLV:ffmpeg -i http://chinaffmpeg.com/live.m3u8 -c copy -f flv output.flv
  • 4.ffmpeg录制和发布 UDP/TCP 流
    • 1.TCP和UDP参数说明
        1. ffmpeg --help full
      • 2.ffmpeg既支持TCP,UDP作为客户端,又支持ffmpeg作为服务端。
    • 2.参数使用举例
      • 1.TCP监听接受流
        • ./ffmpeg -listen 1 -f flv -i tcp://127.0.0.1:1234/live/stream -c copy -f flv out.flv
          • 进入监听模式 等待客户端连接到本地的1234
      • 2.TCP请求发布流
        • ./ffmpeg re -i input.mp4 -c copy -f flv tcp://127.0.0.1:1234/live/stream
          • 发布到1234端口
        • 当监听TCP时指定格式与TCP客户端连接所发布的格式相同时均正常,如果TCP监听的输入格式与TCP客户端连接时所发布的格式不同时,将会出现解析格式异常。
    • 3.监听端口超时 listen_timeout 毫秒
      • 设置5秒超时时间:time ./ffmpeg -listen_timeout 5000 -listen 1 -f flv -i tcp://127.0.0.1234/live/stream -c copy -f flv output.flv
    • 4.TCP 拉流超时参数 timeout 微妙
      • 拉去TCP服务器中的流数据,若超过20s没有数据则退出
        • time ./ffmpeg -timeout 20000000 -i tcp://192.168.100.179:1935/live/stream -c copy -f flv output.flv
    • 5.TCP传输buffer 大小设置send_buffer_size/recv_buffer_size
      • 1.设置TCP传输时buffer的大小,buffer设置得越小,传输就会越频繁,网络开销就会越大。
      • 2 ./ffmpeg -re -i input.mp4 -c copy -send_buffer_size 265 -f flv tcp://192.168.100.179:1234/live/stream
        • 说明:输出速度将会变慢,buffer大小变成了265,数据发送的频率变大,并且次数变多,网络开销也变大,输出速度会变慢。
    • 6.绑定本地UDP端口localport 监听
      • ./ffmpeg -re -i input.mp4 -c copy -localport 23456 -f flv udp://192.168.100.179:1234/live/stream
  • 5.ffmpeg 推多路流
      1. 管道方式输出多路流
      • 1 ./ffmpeg -i input -acodec aac -vcodec libx264 -f flv - | ffmpeg -f mpegts -i - -c copy output1 -c copy output2 -c copy output3
        • 说明:输出格式为flv 输出之后通过管道传给另一条ffmpeg命令,另一条ffmpeg命令直接执行对codec的copy即可实现一次编码多路输出。
      • 2 ./ffmpeg -i input.mp4 -vcodec libx264 -acodec aac -f flv - | ffmpeg -f flv -i - -c copy -f flv rtmp://publish.chinaffmpeg.com/live/stream1 -c copy -f flv rtmp://publish.chinaffmpeg.com/live/stream2
        • 说明:包含两路直播流,一路为stream1,另外一路为stream2.
        • 验证:./ffmpeg -i rtmp://publish.chinaffmpeg.com/live/stream1 -i rtmp://publish.chinaffmpeg.com/live/stream2
      1. tee封装格式输出多路流
      • 1 -f tee
        • ./ffmpeg -re -i input.mp4 -vcodec libx264 -acodec aac -map 0 -f tee "[f=flv]rtmp://publish.chinaffmpeg.com/live/stream1 | [f=flv]rtmp://publish.chinaffmpeg.com/live/stream2"
        • 验证:./ffmpeg -i rtmp://publish.chinaffmpeg.com/live/stream1 -i rtmp://publish.chinaffmpeg.com/live/stream2
    • 3.tee协议输出多路流
      • ./ffmpeg -re -i input.mp4 -vcodec libx264 -acodec aac -f flv "tee:rtmp://publish.chinaffmpeg.com/live/stream1 | rtmp://publish.chinaffmpeg.com/live/stream2"
        • 说明:ffmpeg执行力一次编码,然后输出为tee协议格式,tee中包含了两个子链接,协议全部为RTMP,输出两路RTMP流,一路为stream1,另一路为stream2.
  • 6.ffmpeg 生成HDS流(切片)
      1. HDS 参数说明 ffmpeg -h muxer=hds
      • window_size
      • extra_window_size
      • min_frag_duration
      • remove_at_exit
    • 2.HDS 使用举例
      • 1.window_size参数控制文件列表大小
        • ./ffmpeg -i input -c copy -f hds -window_size 4 output
          • 会生成output目录
            • index.f4m:索引文件
            • stream0.abst:文件流相关描述信息
            • stream0Seg1-Frag:相似规则文件切片,文件切片中均为mdat信息。
  • 7 ffmpeg 生成DASH流
    • DASH参数说明
      • ffmpeg -h muxer=dash
    • 1.window_size, extra_window_size 参数举例
      • ./ffmpeg -re -i input.mp4 -c:v copy -acodec copy -f dash -window_size 4 -extra_window_size 5 index.mpd
        • DASH 直播格式中,音视频是分开切片的,视频是一路切片,音频是一路切片,包含9个音频文件,9个视频文件,2个初始化信息切片,1个索引文件。
          • chunk-stream0-00204.m4s
          • …9个
          • chunk-stream1-00204.m4s
          • …9个
          • index.mpd
          • init-stream0.m4s
          • init-stream1.m4s
    • 2.single_file 参数举例
      • ffmpeg支持生成DASH时将切片列表中的文件写入到一个文件
        • ./ffmpeg -re -i input.mp4 -c:v copy -acodec copy -f dash -window_size 4 -extra_window_size 5 -sigle_file 1 index.mpd
          • 生成3个文件:1个索引文件,1个音频文件,1个视频文件
            • index-stream0.m4s
            • index-stream1.m4s
            • index.mpd

第六章 FFMPEG 滤镜使用

  • 1.ffmpeg 滤镜Filter描述格式

      1. [输入流或标记名]滤镜参数[临时标记名]; [输入流或标记名]滤镜参数[临时标记名]...滤镜参数以: , ;分割。
      • ./ffmpeg -i input.mp4 -i logo.png -filter_complex "[1:v]scale=176:144[logo];[0:v][logo]overlay=x=0:y=0" output.mp4
        • 图像进行缩放176X144的分辨率,然后定义一个logo,最后将缩放后的logo铺在输入视屏input.mp4的视频流 [0:v] 的左上角。
    • ffmpeg滤镜Filter时间内置变量
      • 时间相关的内置变量
  • 2.ffmpeg为视频加水印

    • 1.文字水印
      • 1.需要准备相关的文件,编译的时候需要支持相关的文件。
      • 2.ffmpeg文字滤镜参数列表
      • 3.drawtext 举例
        • ./ffmpeg -i input.mp4 -vf "drawtext=fontsize=100:fontfile=FreeSerif.ttf:text='hello world':x=20:y=20" output.mp4
        • 字体颜色设置为绿色:./ffmpeg -i input.mp4 -vf "drawtext=fontsize=100:fontfile=FreeSerif.ttf:text='hello world:fontcolor=green':x=20:y=20" output.mp4
        • 添加框,水印背景色为黄色: ./ffmpeg -i input.mp4 -vf "drawtext=fontsize=100:fontfile=FreeSerif.ttf:text='hello world':fontcolor=green:box=1:boxcolor=yellow" output.mp4
        • 本地时间作为水印内容: ./ffmpeg -i input.mp4 -vf "drawtext=fontsize=60:fontfile=FreeSerif.ttf:text='%{localtime:\:%Y\-%m\-%d %H-%M-%S}':fontcolor=green:box=1:boxcolor=yellow" output.mp4
        • 定时显示水印,定时不显示水印,drawtext与enable,每3秒钟显示一次文字水印:./ffmpeg -i input.mp4 -vf "drawtext=fontsize=60:fontfile=FreeSerif.ttf:text='test':fontcolor=green:box=1:boxcolor=yellow:enable=lt(mod(t\,3)\,1)" output.mp4
        • 中文字符,系统需要包含中文字库与中文编码支持:./ffmpeg -re -i input.mp4 -vf "drawtext=fontsize=50:fontfile=/Library/Fonts/Songti.ttc:text='文字水印测试':fontcolor=green:box=1:boxcolor=yellow" output.mp4
    • 2.图片水印
      • 1.ffmpeg movie 滤镜的参数列表
      • 2.通过movie指定水印文件路径
        • ./ffmpeg -i input.mp4 -vf "movie=logo.png[wm];[in][wm]overlay=30:10[out]" out.mp4 x=30,y=10
        • movie,colorkey滤镜配合半透明效果:./ffmpeg -i input.mp4 -vf "movie=logo.png,colorkey=black:1.0:1.0[wm];[in][wm]overlay=30:10[out]" out.mp4 colorkey 设置得颜色值、相似度、混合度与原片混合为半透明水印。
      • 3.通过filter读取输入文件的流并指定为水印
  • 3.ffmpeg 生成画中画

    • 1.ffmpeg滤镜overlay基本参数列表
      • ./ffmpeg -re -i input.mp4 -vf "movie=sub.mp4,scale=480x320[test];[in][test]overlay[out]" -vcodec libx264 output.flv 默认x=0,y=0
      • 显示画面右下角:./ffmpeg -re -i input.mp4 -vf "movie=sub.mp4,scale=480x320[test];[in][test]overlay=x=main_w-480:y=main_h-320[out]" -vcodec libx264 output.flv 主画面右边减去子视频的宽度,主画面最下面减去子视频的高度
      • 正则表达式进行跑马灯画中画处理:./ffmpeg -re -i input.mp4 -vf "movie=sub.mp4,scale=480x320[test];[in][test]overlay=x='if(gte(t,2), -w+(t-2)*20,NAN)':y=0[out]" -vcodec libx264 output.flv 从左向右移动
  • 4.ffmpeg视频多宫格处理

    • ./ffmpeg -re -i input1.mp4 -re -i input2.mp4 -re -i input3.m2t -re -i input4.mp4 -filter_complex "nullsrc=size=640x480 [base]; [0:v] setpts=PTS-STARTPTS,scale=320x240 [upperleft]; [1:v] setpts=PTS-STARTPTS,scale=320x240 [upperright]; [2:v] setpts=PTS-STARTPTS,scale=320x240 [lowerleft]; [3:v] setpts=PTS- STARTPTS,scale=320x240[lowerright]; [base][upperleft] overlay=shortest=1[tmp1]; [tmp1][upperright] overlay=shortest=1:x=320 [tmp2];[tmp2][lowerleft] overlay=shortest=1:y=240 [tmp3]; [tmp3][lowerright] overlay=shortest=1:x=320:y=240 -c:v libx264 output.flv
      *[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GeuUhbjy-1683603074446)(:/60a04e2274cd4e6f8b09be6daf38997f)]
  • 5 ffmpeg 音频流滤镜操作

    • 0.amix, amerge, pan, channelsplit, volume, volumedetect 滤镜音频操作。
    • 1.双声道合并单声道
      • ./ffmpeg -i input.aac -ac 1 output.aac
    • 2.双声道提取
      • ./ffmpeg -i input.aac -map_channel 0.0.0 left.aac -map_channel 0.0.1 right.aac map_channel 参数实现
      • pan 滤镜实现./ffmpeg -i input.aac -filter_complex "[0:0]pan=lc|c0=c0[left];[0:0]pan=lc|c0=c1[right]" -map "[left]" left.aac -map "[right]" right.aac
    • 3.双声道转双音频流
      • ./ffmpeg -i input.aac -filter_complex channelsplit=channel_layout=stereo output.mka
        • 文件output.mka 中的音频为两个stream;大多数播放器在默认情况下会播放第一个音频Stream但不会播放第二个,指定播放对应的Stream除外
    • 4.单声道转双声道(当只有中央声道或者只有mono布局时,才可以通过ffmpeg转换为stereo)。
      • ./ffmpeg -i left.aac -ac 2 output.m4a
      • amerge滤镜进行处理 ./ffmpeg -i left.aac -filter_complex "[0:a][0:a]amerge=inputs=2[aout]" -map "[aout]" output.m4a
        • 命令执行后的效果与使用ac的效果相同。这样执行后的双声道并不是真正的双声道,而是由单声道处理成的多声道,效果不会比原有声道效果好。
    • 5.两个音频源合并双声道
      • ./ffmpeg -i left.aac -i right.aac -filter_complex "[0:a][1:a]amerge=inputs=2[aout]" -map "[aout]" output.mka
    • 6.多个音频合并为多声道
      • 将6个mono布局的音频流合并为一个多声道的音频流。
        • ./ffmpeg -i front_left.wav -i front_right.wav -i front_center.wav -i left.wav -i back_left.wav -i back_right.wav -filter_complex "[0:a][1:a][2:a][3:a][4:a][5:a][6:a]amerge=inputs=6[aout]" -map "[aout]" output.wav
  • 6.ffmpeg 音频音量探测

    • 1.音频音量的支持 ,获得音频音量分贝,使用滤镜volumedetect,./ffmpeg -i output.wav -filter_complex volumedetect -c:v copy -f null /dev/null
    • 2.绘制音频波形
      • ./ffmpeg -i output.wav -filter_complex "showwavespic=s=640x120" -frames:v 1 output.png
        • 生成一个宽高为640x120大小的output.png
      • 如果为多声道音频,希望看到每个声道音频的波形图,则可以使用showwavepic与split_channel滤镜配合绘制出不同声道的波形图
        • ./ffmpeg -i output.wav -filter_complex "showwavepic=s=640x240:split_channels=1" -frames:v 1 output:png
  • 7.ffmpeg 为视频加字幕

    • 1.ASS字幕流写入视频流
      ./ffmpeg -i input.mp4 -vf ass=t1.ass -f mp4 output.mp4
    • 2.ASS字幕流写入封装容器(封装容器支持字幕流)
      • ASS字幕流写入MKV封装容器中,字幕流形式存在
        • ./ffmpeg -i input.mp4 -i t1.ass -acodec copy -vcodec copy -scodec copy output.mkv
          • -1.会将input.mp4中的音频流、视频流、t1.ass中的字幕流在不改变编码情况下封装入output.mkv文件中,output.mkv文件将会包含三个流,分别为视频流、音频流及字幕流。
          • -2.而在input.mp4中或者输入视频文件中原本同样带有字幕流并希望使用t1.ass字幕流时,可以通过map功能将字幕流指定封装入output.mkv:./ffmpeg -i input.mp4 -i t1.ass -map 0:0 -map 0:1 -map 1:0 -acodec copy -vcodec copy -scodec copy output.mkv
          • 会分别将第一个输入文件的第一个流和第二个流与第二个输入文件的第一个流写入output.mkv中。
  • 8.ffmpeg 视频抠图合并

    • 1.ffmpeg滤镜 chromakey参数
    • 2.背景颜色查询 ffmpeg -colors
      • ./ffmpeg -i input.mp4 -i input_green.mp4 -filter_complex "[1:v]chromakey=Green:0.1:0.2[ckout];[0:v][ckout]overlay[out]" -map "[out]" output.mp4 图参看页数205
      • 注意 FFmpeg中除了有chromakey滤镜外,还有一个colorkey参数,chromakey滤镜主要处理YUV数据,所以一般来说做绿幕处理更有优势;而colorkey处理纯色均可以,因为colorkey处理主要以RGB数据为主
  • 9.FFmpeg 3D视频处理

    • 1.stereo3d处理3D视频
      • 1-1.ffmpeg滤镜stereo3d参数
    • 2.3D图像转换举例
      • 原片的左右排列转为黄蓝合并排列
        • ./ffmpeg -vf "stereo3d=sbs1:aydb" input.mp4
        • 观看效果:./ffmpeg -vf "stereo3d=sbs1:arbg" input.mp4,效果视频的宽度变小,图像的效果更具有立体感,带上红蓝眼镜观看处理效果更好。
  • 10.FFmpeg定时视频截图

    • 1.vframe参数截取一张图片
      • ./ffmpeg -i input.flv -ss 00:00:7.435 -vframes 1 out.png
    • 2.fps滤镜定时获得图片
      • ./ffmpeg -i input.flv -vf fps=1 out%d.png
        • 将会每隔一秒生成一张PNG图片
      • ./ffmpeg -i input.flv -vf fps=1/60 img%03d.jpg
        • 将会每隔一分钟生成一张JPEG图片
      • ./ffmpeg -i input.flv -vf fps=1/600 thumb%04d.bmp
        • 将会每隔10分钟生成一张BMP图片
      • 按照关键帧截取图片
      • ./ffmpeg -i input.flv -vf "select='eq(pict_type,PICT_TYPE_I)'" -vsync vfr thumb%04d.png
        • ffmpeg 将会判断图像类型是否为I帧,如果是I帧则会生成一张PNG图像。
  • 11.FFmpeg生成测试元数据

    • 通过lavfi设备虚拟音视频数据
    • 1.FFmpeg生成音频测试流
      • 通过lavfi虚拟音频源的abuffer,aevalsrc,anullsrc,fite,anoisesrc,sine滤镜生成音频流
      • ./ffmpeg -re -f lavfi -i abuffer=sample_rate=44100:sample_fmt=s16p:channel_layout=stereo -acodec aac -y output.aac
        • ffmpeg会根据lavfi设备输入的abuffer中定义的采样率,采样格式,以及声道布局,通过AAC编码,生成AAC音频文件。
      • ./ffmpeg -re -f lavfi "aevalsrc=sin(420*2*PI*t)|cos(430*2*PI*t):c=FC|BC" -acodec aac output.aac
    • 2.FFmpeg 生成视频测试流
      • 可以通过ffmpeg模拟多种视频源:allrgb,allyuv,color,haldclutsrc,nullsrc,rgbtestsrc,smptebars,smptehdbars,testsrc,testsrc2,yuvtestsrc;
      • testsrc
        • ./ffmpeg -re -f lavfi -i testsrc=duration=5.3:size=qcif:rate=25 -vcodec libx264 -r:v 25 output.mp4
      • testsrc2
        • ./ffmpeg -re -f lavfi -i testsrc2=duration=5.3:size=qcif:rate=25 -vcodec libx264 -r:v 25 output.mp4
      • color
        • ./ffmpeg -re -f lavfi -i [email protected]:s=qcif:r=25 -vcodec libx264 -r:v 25 output.mp4
      • nullsrc
        • ./ffmpeg -re -f lavfi -i "nullsrc=s=256x256,geq=random(1)*255:128:128" -vcodec libx264 -r:v 25 output.mp4 宽高256x256 数据为随机雪花样
  • 12 FFmpeg对音视频倍速处理

    • 1.atempo 音频倍速处理 (0.5-2)
      • (1)半速处理
        • ./ffmpeg -i input.wav -filter_complex "atempo=tempo=0.5" -acodec aac output.aac
      • (2) 2倍速处理
        • ./ffmpeg -i input.wav -filter_complex "atempo=tempo=2.0" -acodec aac output.aac
    • 2.setpts视频倍速处理
      • (0).ffmpeg 滤镜setpts参数
        • FRAME_RATE
        • PTS
        • RTCTIME
        • TB
      • (1).半速处理
        • ./ffmpeg -re -i input.mp4 -filter_complex "setpts=PTS*2" output.mp4
      • (2)2倍速处理
        • ./ffmpeg -re -i input.mp4 -filter_complex "setpts=PTS/2" output.mp4
          • 输出视频output.mp4时长刚好是input.mp4的duration的一半

你可能感兴趣的:(ffmpeg,音视频)