今天遇到一个问题,用七牛短视频sdk转码后视频变模糊了,得到大神提示后,立马去查看了一番,原来转码后视频B-frame丢失了
补充知识点
- profile=baseline的视频不包含B帧
- 同等码率的视频B帧越多,清晰度越高,但是编码与解码的复杂度也是越高,所以需要合理的设置B帧,尤其是衡量清晰度与码率的时候
统计视频I、B、P帧
ffprobe -v quiet -show_frames transcoded123.mp4 | grep "pict_type=B" | wc -l
控制台输出0,表示这个视频没有B帧,如果要查看I帧和P帧,修改pict_type=I或者P即可
如果需要看关键帧,grep “key_frame=1”
插入B帧
ffmpeg -i transcoded123.mp4 -c:v libx264 -x264opts "bframes=3:b-adapt=0" -g 50 -sc_threshold 0 insertBframe.mp4
在transcoded123.mp4视频中,设置gop长度为50,I帧和B帧之间插入3个B帧,并且设置切换场景不插入关键帧
*** 参数释意 ***
- bframes :设定I帧与P帧之间的最大B帧数量,范围0~16
- b-adapt : B帧自适应方法,默认为1
0: Disabled
1: Fast
2: Optimal (slow with high --bframes) - -sc_threshold :转场时插入B帧
- -g 设置GOP,每50帧插入一个关键帧
接下来继续看一下插入关键帧后的视频有多少个B帧
注意:这里虽然插入了B帧,仍然不能改善原视频transcode123.mp4的画质,基础建设决定上层建筑
json格式查看视频的详细信息
ffprobe -v quiet -show_format -show_streams -print_format json hotoktest.mp4
会以json格式输出"streams"音视频编码信息和“format”音视频封包信息
ffprobe其他常用options解析
- -show_packets:[PACKET]标签的多媒体信息
- -show_data: packets多媒体数据
- -show_format:多媒体封装格式
- -show_frames: 视频帧信息
- -print_format: 信息输出格式,支持xml、csv、json、flat、ini
- -select_streams: 参数可以是a、v、s分别表示只查看音频、视频、字幕