Android上的MediaCodec音频/视频多路复用问题

时间:2014-10-22 09:30:19

标签: android audio video mediacodec

我根据Google提供的示例(https://android.googlesource.com/platform/cts/+/master/tests/tests/media/src/android/media/cts/ExtractDecodeEditEncodeMuxTest.java

转码视频

基本上,MP4文件的转码有效,但在某些手机上我得到了一些奇怪的结果。例如,如果我在HTC One上对带有音频的视频进行转码,则代码不会出现任何错误,但文件无法在手机上播放。如果我有一个10秒的视频,它会跳到几乎最后一秒,而你只有一些噼啪声。如果您使用VLC播放视频,则音轨将完全静音。

我没有在编码/解码方面改变代码,例如,相同的代码在Nexus 5或MotoX上提供了正确的结果。

任何人都知道为什么它可能会在特定设备上失败?

最好的关注并谢谢你, 弗洛里安

2 个答案:

答案 0 :(得分:7)

我通过以下更改使其在Android 4.4.2设备中运行:

  • 将AAC配置文件设置为AACObjectLC而不是AACObjectHE
private static final int OUTPUT_AUDIO_AAC_PROFILE = MediaCodecInfo.CodecProfileLevel.AACObjectLC;
  • 在创建输出音频格式期间,使用输入格式的采样率和通道数而不是固定值
MediaFormat outputAudioFormat = MediaFormat.createAudioFormat(OUTPUT_AUDIO_MIME_TYPE,
inputFormat.getInteger(MediaFormat.KEY_SAMPLE_RATE),
inputFormat.getInteger(MediaFormat.KEY_CHANNEL_COUNT));
  • 在音频复用音频轨道之前进行检查以控制演示时间戳。 (避免timestampUs X < lastTimestampUs X for Audio track错误)
    if (audioPresentationTimeUsLast == 0) { // Defined in the begining of method
      audioPresentationTimeUsLast = audioEncoderOutputBufferInfo.presentationTimeUs;
    } else {
      if (audioPresentationTimeUsLast > audioEncoderOutputBufferInfo.presentationTimeUs) {
        audioEncoderOutputBufferInfo.presentationTimeUs = audioPresentationTimeUsLast + 1;
      }
      audioPresentationTimeUsLast = audioEncoderOutputBufferInfo.presentationTimeUs;
    }

    // Write data

    if (audioEncoderOutputBufferInfo.size != 0) {
       muxer.writeSampleData(outputAudioTrack, encoderOutputBuffer, audioEncoderOutputBufferInfo);
    }

希望这会有所帮助......

答案 1 :(得分:0)

如果原始CTS测试失败,您需要前往设备供应商并要求修复