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

标签 video ffmpeg tokbox vp8 matroska

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

我想实现两个目标:

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

    关于video - 如何将不同帧分辨率的VP8轨道转换为h264,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39467909/

    相关文章:

    ffmpeg - FFMPEG 中的缩放动画

    ios - 如何提高 OpenTok RTC(实时通信)中的视频质量/分辨率

    javascript - 可能妨碍 opentok 视频聊天应用程序的可能错误(bug)

    ios - 如何在 Swift 中将图像导出为视频?

    video - 没有来源的 HTML5 视频标签?

    video - 带有 read_intervals 的 ffprobe 输出帧与给定时间范围不匹配

    ios5 - iFrameExtractor 播放器没有声音

    c# - FFmpeg C# 视频转换

    ffmpeg - MPEG-DASH MPD 文件无法正确播放

    ios - iOS OpenTok音频视频通话已禁用视频,原因是在iOS Simulator和路由 session 上存在未记录的原因