如何将不同帧分辨率的VP8轨道转换为h264



我有一个带有VP8音轨的.webm文件,由外部服务(TokBox存档)从WebRTC流录制。流是自适应的,所以轨道中的每一帧可以有不同的分辨率。大多数播放器(在webkit浏览器中)使用来自轨道描述的视频分辨率(通常是640x480),并按此分辨率缩放帧。Firefox和VLC播放器使用真实帧分辨率,分别改变视频分辨率。

我想实现两个目标:

  1. 在Internet Explorer 9+中播放此视频,无需额外安装插件。
  2. 将帧分辨率更改为一个固定分辨率,以便视频在不同的浏览器中看起来相同。

所以,我的计划是:

  • 从源webm文件中提取帧到具有真实帧分辨率的图像(例如PNG或BMP)(我怎么能做到这一点?)
  • 查找图像的最大宽度和最大高度
  • 为图像添加黑色填充,因此较小的帧将位于新帧的中心(大小为MAX_WIDHTxMAX_HEIGHT)
  • 使用ffmpeg将图像合并到h264轨道

都正确吗?我怎样才能做到这一点呢?这个算法可以被优化吗?

我尝试ffmpeg提取图像,但它不解析真正的帧分辨率,使用轨道标头的分辨率。我认为一些libwebm函数可以帮助我(解析帧头和提取图像)。也许有人有一些代码片段来做到这一点?

示例。webm(下载源代码,不播放google转换版本):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

如果运行

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应替换为您发现的值

相关内容

  • 没有找到相关文章

最新更新