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

Flo*_*ian 4 audio video android 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上给出了正确的结果.

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

最好的,谢谢你,弗洛里安

Efe*_*man 7

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

  • 将AAC配置文件设置为AACObjectLC而不是AACObjectHE
private static final int OUTPUT_AUDIO_AAC_PROFILE = MediaCodecInfo.CodecProfileLevel.AACObjectLC;
Run Code Online (Sandbox Code Playgroud)
  • 在创建输出音频格式期间,使用输入格式的采样率和通道数而不是固定值
MediaFormat outputAudioFormat = MediaFormat.createAudioFormat(OUTPUT_AUDIO_MIME_TYPE,
inputFormat.getInteger(MediaFormat.KEY_SAMPLE_RATE),
inputFormat.getInteger(MediaFormat.KEY_CHANNEL_COUNT));
Run Code Online (Sandbox Code Playgroud)
  • 在音频多路复用音频轨道之前进行检查以控制演示时间戳.(为避免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);
    }
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助...