个人网站多少钱施工企业的内容
这里写自定义目录标题
- 第三章 FFmpeg工具使用基础
 - 3.1 ffmpeg常用命令
 - 3.1.1
 - 3.1.3 转码流程
 
- 3.2 ffprobe 常用命令
 - 3.2.1 ffprobe常用参数
 - 3.2.2 ffprobe 使用示例
 
- 3.3 ffplay常用命令
 - 3.3.1 ffplay常用参数
 - 3.3.2 ffplay高级参数
 - 3.3.4 ffplay快捷键
 
- 第4章 封装与解封装
 - 4.1 视频文件转MP4
 - 4.1.4 MP4在FFmpeg中的Demuxer
 
- 4.2 视频文件转FLV
 - 4.3 视频文件转MPEG-TS
 - 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 STRE 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-bitD.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 second2
00:00:00.301 --> 00:00::60.000
Test second 30 second3
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 分为三层
- ES层: 单独的音频流视频流组成的Elementary Stream, ES
 - PES层: 将ES按一定的规则进行封装,如H.264的AU作为拆分单元,打上时间戳,组成分组的基本数据流 Packetized Elementary Stream, PES,
 - 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的长度头更换为起始码的头
- 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
