MKV 视频文件无法在 Lollipop 上播放

MKV video file not playing on Lollipop

我试图在 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。可能是什么问题?请帮忙。

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

虽然 Matroska file specification(参考:第 21 页,Table 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 确认他们是否同意此更改。