我有一个带有VP8轨道的.webm文件,通过外部服务(TokBox Archiving)从WebRTC流记录。流是自适应的,因此轨道中的每个帧可以具有不同的分辨率。大多数播放器(在webkit浏览器中)使用来自轨道描述的视频分辨率(总是640x480)并将帧缩放到此分辨率。 Firefox和VLC播放器使用实际帧分辨率,分别改变视频分辨率。
我想实现2个目标:
所以,我的计划是:
一切都正确吗?我怎样才能做到这一点?这个算法可以通过某种方式进行优化吗?
我尝试使用ffmpeg来提取图像,但它不会使用轨道标题的分辨率来解析实际帧分辨率。 我认为一些libwebm函数可以帮助我(解析帧头和提取图像)。也许某人有一些代码片段可以做到这一点?
示例.webm(下载源代码,不要播放谷歌转换版本):https://drive.google.com/file/d/0BwFZRvYNn9CKcndhMzlVa0psX00/view?usp=sharing
来自TokBox支持的自适应流的官方描述:https://support.tokbox.com/hc/en-us/community/posts/206241666-Archived-video-resolution-is-supposed-to-be-720x1280-but-reports-as-640x480
答案 0 :(得分:2)
如果你跑
ffprobe -show_entries frame=width,height -of compact=p=0:nk=1 video.webm
你会得到一个如下所示的输出:
1254|800
1058|800
890|800
774|800
672|800
左列是每个帧的实际宽度,右列是高度。然后,您可以检查每列中的最大值,以用于画布大小。
然后运行
ffmpeg -i video.webm -vf pad=MAXW:MAXH:(MAXW-iw)/2:(MAXH-ih)/2 out.mp4
其中MAXW和MAXH应替换为您发现的值。