4

尝试将 HEVC 编码的视频复用到三星 Galaxy S6 上的 MediaMuxer MPEG-4 容器。

MediaFormat(从 MediaCodec 获得):

{height=1080, width=1920, max_capacity=8847360, what=1869968451, mime=video/hevc, csd-0=java.nio.ByteArrayBuffer[position=0,limit=76,capacity=76], remained_resource=6773760}

根据文档中的表格, csd-0出现在那里,这对于 H265/hevc 来说已经足够了

MediaMuxer 基于此格式创建索引为 0 的视频轨道。在编写了一些示例然后调用之后mediaMuxer.stop()IllegalStateException会抛出并在 logcat 中显示以下内容:

E/MPEG4Writer:缺少编解码器特定数据
D/MPEG4Writer:视频轨道停止
D/MPEG4Writer:视频轨道源停止
D/MPEG4Writer:视频轨道源停止
I/MPEG4Writer:接收到的总/0 长度 (247/0) 缓冲区和编码的 247 帧。- 声音的
I/MPEG4Writer:音轨漂移时间:0 us
I/MPEG4Writer:接收到总/0 长度 (173/0) 缓冲区并编码 173 帧。- 视频
D/MPEG4Writer:视频轨道停止
D/MPEG4Writer:音轨停止
D/MPEG4Writer:音轨源停止
D/MPEG4Writer:音轨源停止
D/MPEG4Writer:音轨停止
D/MPEG4Writer:轨道范围的持续时间是 [5744606, 5764430] 我们
D/MPEG4Writer:停止编写器线程
D/MPEG4Writer:最后一批写入了 0 个块
D/MPEG4Writer:编写器线程已停止
E/MP4FileMuxer:完成:停止或释放失败
java.lang.IllegalStateException:无法停止多路复用器

生成的 MP4 文件无法播放。可能是什么问题?

4

1 回答 1

3

所以,回答我自己的问题:似乎只有从 Android 7.0 r1 开始的 MediaMuxer 才支持“video/hevc”(即使使用 N-preview-5 也不起作用)。看起来MediaMuxer.addTrack()的文档已更新以反映这一点。

相关AOSP代码:

N preview 5 上的 MPEG4Writer.cpp - 不支持 HEVC

N r1 上的 MPEG4Writer.cpp - 无处不在的 HEVC 点点滴滴

不幸的是,有些带有 Marshmallow 的设备支持 HEVC 视频编码(例如三星 Exynos),但使用 MediaMuxer 将其转储到 MP4 文件将不起作用,因此需要自定义解决方案。

于 2016-08-25T16:34:46.407 回答