【发布时间】:2014-12-04 19:23:55
【问题描述】:
我希望能够在某些设备上使用 mp4v-es 而不是 avc。编码器使用 avc 运行良好,但是当我用 mp4v-es 替换它时,muxer 报告:
E/MPEG4Writer(12517): Missing codec specific data
如MediaMuxer error "Failed to stop the muxer",视频无法播放。不同之处在于我向复用器添加了正确的轨道/格式,而没有收到任何错误:
...else if (encoderStatus == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) {
MediaFormat newFormat = encoder.getOutputFormat();
mTrackIndex[encID] = mMuxer.addTrack(newFormat);
处理 mp4v-es 与处理 avc 有什么不同吗?一提,我只是跳过“bufferInfo.flags & MediaCodec.BUFFER_FLAG_CODEC_CONFIG”,因为它不需要avc。谢谢。
【问题讨论】:
-
newFormat 有 csd-0 和 csd-1 吗?
-
@Marlon:新格式为:{height=720, mime=video/mp4v-es, csd-0=java.nio.ByteArrayBuffer[position=0,limit=30,capacity=30] , what=1869968451, width=1280} 和 csd-0: 000001B006000001B58913000001000000012000C48881F4528045A1463F。 csd-1 不存在,但我认为它只出现在 H264 中。
-
stackoverflow.com/questions/21341169/… 看起来可能需要 csd-1
-
从
encoder到MPEG4Writer,我不认为csd必须有2 个缓冲区。MPEG4Writer只能处理一个缓冲区。当没有CSD时出现错误,即Missing codec specific data。对于video/mp4v-es即MPEG4视频基本流,MPEG4Writer期望将数据打包为ESDS格式,而AVCC如下所示:androidxref.com/5.0.0_r2/xref/frameworks/av/media/… -
csd在创建新的Track时被读取(参考:MPEG4Writer.cpp以上,第 1370 行)。对于轨道,视频编码器是源,因此,您的编码器应支持getFormat,其中数据应以ESDS格式打包。
标签: android video-encoding android-mediacodec mediamuxer