Video 如何将不同帧分辨率的VP8曲目转换为h264

Video 如何将不同帧分辨率的VP8曲目转换为h264,video,ffmpeg,tokbox,vp8,matroska,Video,Ffmpeg,Tokbox,Vp8,Matroska,我有一个带有VP8曲目的.webm文件,由外部服务(TokBox存档)从WebRTC流中录制。流是自适应的,因此轨迹中的每一帧可能具有不同的分辨率。大多数播放器(在webkit浏览器中)使用曲目描述的视频分辨率(始终为640x480)并将帧缩放到此分辨率。Firefox和VLC播放器使用真实帧分辨率,分别更改视频分辨率 我想实现两个目标: 在Internet Explorer 9+中播放此视频,无需额外安装插件 将帧分辨率更改为一个固定分辨率,这样视频在不同的浏览器中看起来会完全相同 因此,我的

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

我想实现两个目标:

  • 在Internet Explorer 9+中播放此视频,无需额外安装插件
  • 将帧分辨率更改为一个固定分辨率,这样视频在不同的浏览器中看起来会完全相同
  • 因此,我的计划是:

    • 将源webm文件中的帧提取为具有真实帧分辨率(例如PNG或BMP)的图像(我如何做到这一点?)
    • 查找图像的最大宽度和最大高度
    • 为图像添加黑色填充,这样较小的帧将位于新帧的中心(大小为MAX_WIDHTxMAX_HEIGHT)
    • 使用ffmpeg将图像合并到h264曲目
    一切都对吗?我怎样才能做到这一点?这个算法可以通过某种方式进行优化吗

    我尝试了ffmpeg来提取图像,但它并没有解析真实的帧分辨率,而是使用了来自曲目头的分辨率。 我认为一些libwebm函数可以帮助我(解析帧头和提取图像)。也许有人有一些代码片段来做这件事

    示例.webm(下载源代码,不播放谷歌转换版本):

    TokBox支持的自适应流的官方描述:

    如果您运行

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

    如果您运行

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

    太好了!第一个命令真的很有意义。谢谢但是第二个有点不正确:
    iw
    ih
    在pad filter中,将从源视频的头部而不是当前帧返回分辨率。无论如何,谢谢!不,在这里可以很好地处理你的测试文件。升级您的ffmpeg。也许,我可以将pad过滤器应用于特定帧?嗯,我将尝试编译最新的3.1.3版本(WAS3.0.1)。谢谢我尝试了最新的ffmpeg版本,得到了同样的结果:棒极了!第一个命令真的很有意义。谢谢但是第二个有点不正确:
    iw
    ih
    在pad filter中,将从源视频的头部而不是当前帧返回分辨率。无论如何,谢谢!不,在这里可以很好地处理你的测试文件。升级您的ffmpeg。也许,我可以将pad过滤器应用于特定帧?嗯,我将尝试编译最新的3.1.3版本(WAS3.0.1)。谢谢我尝试了最新的ffmpeg版本,得到了相同的结果: