【问题标题】:MediaCodec audio/video muxing issues ond AndroidAndroid 上的 MediaCodec 音频/视频混合问题
【发布时间】:2014-10-22 09:30:19
【问题描述】:

我正在根据 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 上给出了正确的结果。

有人知道为什么它会在特定设备上失败吗?

最好的问候,谢谢, 弗洛里安

【问题讨论】:

  • 生成坏文件的设备上使用的是什么版本的 Android?
  • 它是 Android 4.4.2,在代码正常工作的 Nexus 5 和不工作的 HTC One 上。顺便说一句,它甚至可以在装有 Android 4.4.2 的摩托罗拉 Moto X 上运行。
  • 嗨,我也看到某些 4.4.2 设备的结果相同。另一方面,示例代码在三星 Galaxy S3 (4.3) 上运行良好。

标签: android audio video android-mediacodec


【解决方案1】:

我通过以下更改使其在 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);
    }

希望这会有所帮助...

【讨论】:

  • 感谢您的帮助。还有一件事,skipFrame 变量是从哪里来的,你在哪里设置的?
  • 您好,可以丢弃,没用。我修改了剪断的代码。很抱歉造成混乱。
【解决方案2】:

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

【讨论】:

  • 问题是,测试实际上并没有失败或抛出错误。结果很奇怪,因此视频在该特定平台上具有损坏的音轨。我比较了两部不同手机之间的日志输出(缓冲区、演示时间等),它们完全相同。但是,一台设备生成的视频可以正常工作,而另一台设备的视频则不能...
  • // TODO:检查生成的输出文件。 - 这个测试没有输出文件检查,所以为什么设备供应商可能没有检测到问题
  • 是的,你可能是对的。不过,最好找到这个问题的根本原因。我只是想了解错误的来源。
  • 错误更可能来自 MediaCodec 编码器。要了解问题所在,您需要分析输出文件\比特流。我建议您从 Elecard Stream Eye 工具开始。另外请分享输出文件,我会看看它
  • 非常感谢,这是我转码的视频链接:dl.dropboxusercontent.com/u/12647354/Test%20Upload.mp4 源视频播放正常,经过CTS测试转码后,收到提供的结果。
猜你喜欢
  • 2013-09-22
  • 2016-03-12
  • 2012-02-06
  • 2015-01-02
  • 2023-03-31
  • 2014-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多