【深入理解FFMPEG】命令行阅读笔记

这里写自定义目录标题

  • [第三章 FFmpeg工具使用基础](#第三章 FFmpeg工具使用基础)
    • [3.1 ffmpeg常用命令](#3.1 ffmpeg常用命令)
      • 3.1.1
      • [3.1.3 转码流程](#3.1.3 转码流程)
    • [3.2 ffprobe 常用命令](#3.2 ffprobe 常用命令)
      • [3.2.1 ffprobe常用参数](#3.2.1 ffprobe常用参数)
      • [3.2.2 ffprobe 使用示例](#3.2.2 ffprobe 使用示例)
    • [3.3 ffplay常用命令](#3.3 ffplay常用命令)
      • [3.3.1 ffplay常用参数](#3.3.1 ffplay常用参数)
      • [3.3.2 ffplay高级参数](#3.3.2 ffplay高级参数)
      • [3.3.4 ffplay快捷键](#3.3.4 ffplay快捷键)
  • [第4章 封装与解封装](#第4章 封装与解封装)
    • [4.1 视频文件转MP4](#4.1 视频文件转MP4)
      • [4.1.4 MP4在FFmpeg中的Demuxer](#4.1.4 MP4在FFmpeg中的Demuxer)
    • [4.2 视频文件转FLV](#4.2 视频文件转FLV)
    • [4.3 视频文件转MPEG-TS](#4.3 视频文件转MPEG-TS)
    • [4.4 视频文件转HLS](#4.4 视频文件转HLS)

第三章 FFmpeg工具使用基础

3.1 ffmpeg常用命令

ffmpeg --help

ffmpeg -h

ffmpeg -h long 查看高级参数部分

ffmpeg -h full 产科全部参数部分

ffmpeg -h type=name

其中 type为 decoder/encoder/demuxer/muxer/filter/bsf/protocol 的一种

name为对应的组件的名字

ffmpeg -L 查看ffmpeg目前支持的license协议

ffmpeg -version 查看ffmpeg版本,以及子模块的详细版本信息

ffmpeg -formats 查看当前ffmpeg支持的容器文件格式,返回值如下:

复制代码
File formats:
 D. = Demuxing supported
 .E = Muxing supported
 --
 D  3dostr          3DO STR
  E 3g2             3GP2 (3GPP2 file format)
  E 3gp             3GP (3GPP file format)
  ...

共三列,

第一列 D表示 Demuxing, E表示 Muxing

第二列 容器格式在FFmpeg中使用的简短名字

第三列 容器文件格式的补充说明

ffmpeg -codecs 查看编解码格式的所有信息,如:

复制代码
Codecs:
 D..... = Decoding supported
 .E.... = Encoding supported
 ..V... = Video codec
 ..A... = Audio codec
 ..S... = Subtitle codec
 ..D... = Data codec
 ..T... = Attachment codec
 ...I.. = Intra frame-only codec
 ....L. = Lossy compression
 .....S = Lossless compression
 -------
 D.VI.S 012v                 Uncompressed 4:2:2 10-bit
 D.V.L. 4xm                  4X Movie
 ...

共三列,

第一列 D表示支持解码,E表示支持编码,以及编码的音频/视频/字幕/数据/附件类型,或者只有I帧的编码压缩格式,以及有损和无损压缩类型

第二列 Codec在FFmpeg中使用的简短名字

第三列 Codec格式的详细说明,如果一个Codec有多个对应实现,也会在小括号中显示出来

ffmpeg -encoders / ffmpeg -decoders

ffmpeg -h muxer=flv

ffmpeg -h demuxer=flv

ffmpeg -h encoder=h264

ffmpeg -h filter=colorkey

3.1.1

ffmpeg 中 AVFormatContext 的主要参数

参数 说明
avioflags 缓冲设置, 默认为0 direct: 无缓冲
probesize probing size

等等

ffmpeg 中 AVCodecContext 的主要参数

参数 说明
b 设置文件码流
ab 设置音频码率(不同音频encoder有不同的默认值),
g 设置max gop size
ar 设置音频sample_rate,
ac 设置音频channel_count,
bf 设置连续编码B帧的个数,设置为0是无B帧
profile 设置音视频的profle
level 设置音视频的level
level 设置音视频的level
color_primaries 设置视频的primaries (from 1 to 10) (default unspecified)
color_trc 设置视频的color transfer characteristics (from 1 to 18) (default unspecified)
colorspace 设置视频的colorspace,如 bt709, rgb 等
color_range 设置视频的range mpeg: MPEG (219*2^(n-8)) jpeg: JPEG (2^n-1)
更多信息查看ffmpeg -h full 的返回值

3.1.3 转码流程

ffmpeg -i input1.rmvb -vcodec mpeg4 -b:v 200k -r 15 -an output.mp4

3.2 ffprobe 常用命令

3.2.1 ffprobe常用参数

ffprobe -v 指定log级别, quiet/panic -> debug/ trace

ffprobe -show_format

ffprobe -show_streams 查看文件的流信息, 如视频codec, 帧率,位深,nal_length_size, profile/level, has_b_frames等

ffprobe -show_chpters

ffprobe -v trace -show_format -show_streams -show_chapters -of json video.mp4

3.2.2 ffprobe 使用示例

ffprobe -show_packets input.flv 查看多媒体数据包信息

ffprobe -show_data -show_packets input.flv 查看每一包信息以及包中的具体数据

ffprobe -show_format output.mp4 查看文件format信息

ffprobe -show_frames input.flv 查看视频的每一帧信息

ffprobe -of xml -show_streams input.flv 查看每一路stream的信息,xml的格式输出

此外,of还可以跟 ini/ json/ csv / flat 等信息

ffprobe -show_frames -select_streams v -of xml input.mp4 只查看视频信息

select_streams 后面可以跟 v a s,分别表示 视频/音频/字幕

如果不需要输出所有字段的信息,可以结合 show_entries来使用,如:

ffprobe -select_streams v -show_packets -show_entries packet=codec_type,pts_time,pos input.mp4

表示只输出 packet中的 codec_type/pst_time/pos等字段信息

ffprobe -v trace input.mp4 2>&1| findstr "parent:'root'" 查看文件中box的位置信息

3.3 ffplay常用命令

3.3.1 ffplay常用参数

ffplay --help

与ffplay 相关的命令

x, y 设置显示窗口的宽高

s 设置视频显示宽高,主要用于播放yuv/rgb裸流, 有的版本没有这个信息

fs 强制全屏播放

an/vn/sn 屏蔽音频/视频/字幕

ss/t 设置seek开始的秒数/设置播放的时间长度

bytes: seek by byes, 0:off, 1:on, -1 auto

nodisp: 关闭显示窗口

f 强制使用某格式,主要用于rawvideo播放裸流

window_title 设置显示窗口的标题

af/vf 设置音频/视频滤镜

codec 强制使用某个codec, 主要针对存在多个视频codec的情况

autorotate 自动旋转视频

ffplay -ss 0 -t 10 input.mp4

ffplay -window_title "Hello, World" output.mp4

ffplay -window_title "播放测试" rtmp://up.v.test.com/live/stream //实际播放不了

3.3.2 ffplay高级参数

ast/vst/sst 设置将要播放音频/视频/字幕流

stats 输出多媒体播放状态 //没发现有啥作用

autoexit 播放完成后自动退出ffplay, 默认不自动退出

exitonkeydown/exitonmousedown 有按键事件/鼠标按键事件后退出ffplay

loop 设置播放循环次数

framedrop cpu占用过高时,自动丢帧

infbuf 设置无极限的播放器buffer,主要用于流媒体播放场景

vf 设置视频滤镜

acodec/vcodec/scodec 强制使用某个codec

time xxx // window上无法使用time统计耗时信息

ffplay -vcodec h264 output.mp4 强制使用h264解码器解码非h264码流会报错

ffmpeg -vst 4 -ast 5 test.ts 针对ts流中有多路节目时,选择对应的音频流和视频流

ffplay -window_title "Test Movie" -vf "subtitles=input.srt" output.mp4

播放视频时,带上 input.srt的字幕文件

input.srt内容可以为

复制代码
1
00:00:00.000 --> 00:00::30.000
Test first 30 second

2
00:00:00.301 --> 00:00::60.000
Test second 30 second

3
00:01:01.000 --> 00:01::10.000
Test end

3.3.3 ffplay的数据可视化分析应用

ffplay -showmode 1 output.mp3 //音频的波形以振幅的形式显示出来

ffplay -debug vis_mb_type -window_title "show vis_mb_type" -ss 20 -t 10 -autoexit output.mp4

注: 较新的版本上的 AVCodecContext 帮助中,其-debug没有 vis_mb_type, 只有 qp/mb_type 等信息,不是打印在视频的宏块上,而是直接打印在log里面,如下图,打印的是720x960(每帧45x60个宏块)视频的qp信息,

下面时某一帧每个宏块的qp值
ffplay -vismv pf output.mp4 // 没有 vismv 这个命令

ffplay -flags2 +export_mvs video.mp4 -vf codecview=mv=pf+bf+bb // 这个可以将mv信息显示在画面上,如果没有 flags参数,单纯使用 codecview filter,还是无效果

3.3.4 ffplay快捷键

ffplay播放过程中的一些快捷键

快捷键 功能
f 全屏/非全屏切换
f 全屏/非全屏切换
s 逐帧显示图像,(暂停的状态时)
w 显示图像和声音波形之间切换
← / → 后退10s/前进10s
↑ / ↓ 前进60s/后台60s
鼠标右键单击 seek至指定位置
鼠标左键双击 切换全屏/非全屏
m 静音切换
功能键区(非小键盘)的 9和0 增大和减小音量
小键盘区的 / 和 * 增大和减小音量
p 暂停/恢复播放
q和 ESC 退出播放

第4章 封装与解封装

4.1 视频文件转MP4

4.1.4 MP4在FFmpeg中的Demuxer

ffmpeg -h demuxer=mp4

个人觉得有用的信息

ignore_editlist 忽略EditList box信息,默认不开启,

如果同一个视频,ffplay播放音视频不同步,其他播放器正常,可能是mp4的 editlist box里面的参数缘故,设置这个参数再尝试一下

ffmpeg -h muxer=mp4

个人觉得有用的信息

movflags

faststart 设置将moov box置于文件的开头,

dash 将MP4封装为fragment mp4,以便兼容DASH

ffmpeg -i input.flv -c copy -f mp4 output.mp4

ffmpeg -i input.flv -c copy -f mp4 -movflags faststart output.mp4

ffmpeg -i input.flv -c copy -f mp4 -movflags dash output.mp4

ffmpeg -re -i input.mp4 -c copy -movflags isml+frag_keyframe -f ismv Stream //与普通mp4的差异就是,Stream里面的 compatible_brands为 ismlpiff, 这里的 -re 表示 每秒只读取1s的input.mp4数据来处理,所以视频有多长,转码时间就会有多长,为了加快速度,可以取消到 -re 这个命令

ffmpeg -i input.mp4 -c:v libx265 -c:a aac -crf 25 -tag:v hvc1 outputh265.mp4

与不加 -tag:v hvc1生成的普通Mp4相比,

普通MP4视频生成 hev1 box, 这里生成 hvc1 box

4.2 视频文件转FLV

ffmpeg -h muxer=flv 查看 flv muxer的使用信息

ffmpeg -i input_ac3.mp4 -c copy -f flv output.flv

ffmpeg -i input_ac3.mp4 -vcodec copy -acodec aac -f flv output.flv

ffmpeg -i input.mp4 -c copy -f flv -flvflags add_keyframe_index output.flv

相比默认 不加 flvflags的命令,生成的flv文件,多了存放关键帧信息的metadata

ffprobe -v trace -i output.flv // 查看flv信息

4.3 视频文件转MPEG-TS

TS/PS 分为三层

  1. ES层: 单独的音频流视频流组成的Elementary Stream, ES
  2. PES层: 将ES按一定的规则进行封装,如H.264的AU作为拆分单元,打上时间戳,组成分组的基本数据流 Packetized Elementary Stream, PES,
  3. TS/PS 层: 将PES包进行切分再封装成固定大小(一般为188 Byte)的传输流 Transport Stream, TS
    ffmpeg -h muxer=mpegts 查看mpegts muxer的帮助信息

4.4 视频文件转HLS

ffmpeg -h muxer=hls 查看hls muxer的help信息

ffmpeg -i input.mp4 -c copy -f hls -bsf:v h264_mp4toannexb output.m3u8

实操发现是否加 -bsf:v h264_mp4toannexb, 效果一样,ffmpeg内部会自动把MP4中nal的长度头更换为起始码的头

  1. start_number参数
    ffmpeg -i input.mp4 -c copy -f hls -bsf:v h264_mp4toannexb -start_number 300 output.m3u8 // 设置m3u8中的切片从 300开始
    ffmpeg -i input.mp4 -c copy -f hls -bsf:v h264_mp4toannexb -hls_time 10 output.m3u8
    每一个切片,几乎都是10s

    D:_Video>type output.m3u8
    #EXTM3U
    #EXT-X-VERSION:3
    #EXT-X-TARGETDURATION:11
    #EXT-X-MEDIA-SEQUENCE:0
    #EXTINF:11.066667,
    output0.ts
    #EXTINF:10.166667,
    output1.ts
    #EXTINF:10.000000,
    output2.ts
    #EXTINF:6.166667,
    output3.ts
    #EXT-X-ENDLIST

ffmpeg -i input.mp4 -c copy -f hls -hls_list_size 3 output.m3u8

只保留了最多3片的切片

复制代码
D:\_Video>type output.m3u8
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:2
#EXT-X-MEDIA-SEQUENCE:13
#EXTINF:2.266667,
output13.ts
#EXTINF:2.300000,
output14.ts
#EXTINF:1.600000,
output15.ts
#EXT-X-ENDLIST

hls_wrap 参数已经废弃

ffmpeg -i input.mp4 -c copy -f hls -hls_base_url http://192.168.0.1/lives/ output1.m3u8

从生成的m3u8来看,每个分片都加了 http://192.168.0.1/lives/ 的前缀

复制代码
D:\_Video>type output1.m3u8
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:2
#EXT-X-MEDIA-SEQUENCE:11
#EXTINF:1.800000,
http://192.168.0.1/lives/output111.ts
#EXTINF:1.833333,
http://192.168.0.1/lives/output112.ts
#EXTINF:2.266667,
http://192.168.0.1/lives/output113.ts
#EXTINF:2.300000,
http://192.168.0.1/lives/output114.ts
#EXTINF:1.600000,
http://192.168.0.1/lives/output115.ts
#EXT-X-ENDLIST

ffmpeg -i input.mp4 -c copy -vframes 1000 -f hls -hls_segment_filename test_output-%d.ts output.m3u8

可以看出,切片名字不再是默认的 output1.ts, output2.ts 这些ts

而是指定的 test_output-%d.ts

复制代码
D:\_Video>type output.m3u8
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:3
#EXT-X-MEDIA-SEQUENCE:9
#EXTINF:3.066667,
test_output-9.ts
#EXTINF:3.300000,
test_output-10.ts
#EXTINF:1.800000,
test_output-11.ts
#EXTINF:1.833333,
test_output-12.ts
#EXTINF:2.100000,
test_output-13.ts
#EXT-X-ENDLIST

ffmpeg -f lavfi -i testsrc2=s=176x144:r=15 -vcodec libx264 -g 30 -r:v 15 -f hls -hls_time 2 -hls_list_size 4 -hls_flags delete_segments -t 30 output-test.m3u8

复制代码
D:\_Video>type output-test.m3u8
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:2
#EXT-X-MEDIA-SEQUENCE:11
#EXTINF:2.000000,
output-test11.ts
#EXTINF:2.000000,
output-test12.ts
#EXTINF:2.000000,
output-test13.ts
#EXTINF:2.000000,
output-test14.ts
#EXT-X-ENDLIST

-t 30 指定要生成30s的视频,hls_time 为2,指定切片duration为2s, 故一共有15个切片

从 output-test0 - output-test14

而这是了 delete_segment, 且 hls_list_size 4, 故前11个切片都删了,只保留最后4个

ffmpeg -i input.mp4 -c copy -f hls -hls_flags round_durations output.m3u8

复制代码
D:\_Video>type output.m3u8
#EXTM3U
#EXT-X-VERSION:2
#EXT-X-TARGETDURATION:2
#EXT-X-MEDIA-SEQUENCE:11
#EXTINF:2,
output11.ts
#EXTINF:2,
output12.ts
#EXTINF:2,
output13.ts
#EXTINF:2,
output14.ts
#EXTINF:2,
output15.ts
#EXT-X-ENDLIST

每一片的切片时长变为了整数,而不是浮点数了

discount_start 子参数, P124 todo

相关推荐
烧冻鸡翅QAQ1 小时前
考研408笔记
笔记·考研
StarPrayers.1 小时前
卷积层(Convolutional Layer)学习笔记
人工智能·笔记·深度学习·学习·机器学习
能不能别报错1 小时前
K8s学习笔记(十五) pause容器与init容器
笔记·学习·kubernetes
无言以对,沉默不语,随你随你。2 小时前
【解决办法】GitBash不能在任意文件夹打开
经验分享·笔记·git
牛马大师兄3 小时前
STM32独立看门狗IWDG与窗口看门狗WWDG知识梳理笔记
笔记·stm32·单片机·嵌入式硬件·嵌入式·看门狗
wan5555cn3 小时前
Windows 11系统鼠标键盘被禁用问题的全面解决方案
windows·笔记·深度学习·计算机外设
zhangrelay3 小时前
ROS云课三分钟-使用动态参数重配置调试Teb导航案例-251008
笔记·学习
BingeBlog4 小时前
[01] Qt的UI框架选择和对比
开发语言·c++·笔记·qt·ui·开源软件
生物小卡拉4 小时前
R脚本——Deseq2差异表达分析--v1.0
windows·经验分享·笔记·学习·信息可视化·数据分析
初九之潜龙勿用6 小时前
技术与情感交织的一生 (十四)
笔记·印象笔记