【问题标题】:MKV video file not playing on LollipopMKV 视频文件无法在 Lollipop 上播放
【发布时间】:2015-03-07 16:13:59
【问题描述】:

我试图在Lollipop 版本上播放MKV 视频文件,但无法播放,尽管它​​在Kitkat 版本中正常工作。

我在调试问题时的发现如下,

在函数ParseTrackEntry()

音频、视频和内容编码的默认轨道设置设置为 -1

如果当前轨道的 id 不是视频也不是音频,而是 content_encoding 类型,则轨道设置会相应更新。

函数后面会根据轨道类型解析缓冲区,即如果轨道是视频类型,那么音频轨道设置应该小于0,similarly if the track consist of audio the video track setting should be less than 0

但如果轨道包含内容编码类型,则还要检查视频、音频和内容编码轨道设置。

因为在类型内容编码的情况下会更新轨道设置,所以这里失败了

if (e.start >= 0)
    return E_FILE_FORMAT_INVALID;

删除内容编码检查后,MKV 文件将成功播放。

我的文件有一个video 轨道、一个audio 轨道和多个subtitles。可能是什么问题?请帮忙。

【问题讨论】:

    标签: android android-5.0-lollipop stagefright


    【解决方案1】:

    我认为这个问题可能是由于mkvparser.cpp 中的检查缺失所致。在ParseTrackEntry 中,一旦识别出TrackEntry,就会检查audio 是否存在于video 数据包中,反之亦然。

    虽然Matroska file specification(参考:第 21 页,表 8 之前的注释)指定这也是允许的,但当前的实现会报告错误。

    TrackEntry 元素不是videoaudiosubtitlemetadata 时,ContentEncoding 的处理方式必须非常明确。此line 中的检查对metadata 有效。但是,对于 subtitle 轨道,规范显示可以存在 ContentEncoding 元素(参考:上述标准的第 24 页)。

    因此,这个检查应该变成

    if((info.type == Track::kMetadata) && (e.start >= 0))
        return E_FILE_FORMAT_INVALID;
    

    通过此更改,对于带有ContentEncodingsubtitle 轨道,处理将继续并且您的文件应该会播放。

    P.S:如果他们同意此更改,我们可能需要与 Google 核实。

    【讨论】:

    • 感谢 Ganesh 的解释。我尝试了上述检查并且工作正常。
    • 更改已合并:gerrit.chromium.org/gerrit/#/c/73474 感谢调试此问题
    • @LajosMolnar .. 谢谢。很高兴在很长一段时间后收到你的来信:)
    猜你喜欢
    • 2020-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-27
    • 1970-01-01
    • 1970-01-01
    • 2018-08-27
    • 1970-01-01
    相关资源
    最近更新 更多