如何将具有不同帧分辨率的VP8轨道转换为h264
How to convert VP8 track with different frame resolution to h264
我有一个带有 VP8 音轨的 .webm 文件,由外部服务 (TokBox Archiving) 从 WebRTC 流录制。流是自适应的,因此轨道中的每个帧都可以具有不同的分辨率。大多数播放器(在 webkit 浏览器中)使用轨道描述中的视频分辨率(始终为 640x480)并将帧缩放到该分辨率。 Firefox 和 VLC 播放器使用真实帧分辨率,分别改变视频分辨率。
我想实现 2 个目标:
- 无需安装额外的插件即可在 Internet Explorer 9+ 中播放此视频。
- 将帧分辨率更改为一种固定分辨率,这样视频在不同的浏览器中看起来会完全相同。
那么,我的计划是:
- 从源 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
左栏是每一帧的实际宽度,右栏是高度。然后您可以检查每列中的最大值,以用于 canvas 大小。
然后运行
ffmpeg -i video.webm -vf pad=MAXW:MAXH:(MAXW-iw)/2:(MAXH-ih)/2 out.mp4
其中 MAXW 和 MAXH 应替换为您发现的值。
我有一个带有 VP8 音轨的 .webm 文件,由外部服务 (TokBox Archiving) 从 WebRTC 流录制。流是自适应的,因此轨道中的每个帧都可以具有不同的分辨率。大多数播放器(在 webkit 浏览器中)使用轨道描述中的视频分辨率(始终为 640x480)并将帧缩放到该分辨率。 Firefox 和 VLC 播放器使用真实帧分辨率,分别改变视频分辨率。
我想实现 2 个目标:
- 无需安装额外的插件即可在 Internet Explorer 9+ 中播放此视频。
- 将帧分辨率更改为一种固定分辨率,这样视频在不同的浏览器中看起来会完全相同。
那么,我的计划是:
- 从源 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
左栏是每一帧的实际宽度,右栏是高度。然后您可以检查每列中的最大值,以用于 canvas 大小。
然后运行
ffmpeg -i video.webm -vf pad=MAXW:MAXH:(MAXW-iw)/2:(MAXH-ih)/2 out.mp4
其中 MAXW 和 MAXH 应替换为您发现的值。