【问题标题】:Android Multimedia Tunneling Sync HeaderAndroid 多媒体隧道同步标头
【发布时间】:2020-04-01 18:06:58
【问题描述】:

上下文

我正在创建一个使用 Multimedia Tunneling 播放媒体源扩展流的 Android 应用程序。我正在使用文档提供的 API 调用流程。音频部分由AudioTrack 处理。 AudioSessionID 在视频MediaCodecAudioTrack 之间共享。 Android SDK 版本为 26。

问题

视频正在正确播放,但听不到音频。

  • API 没有报告任何错误。
  • 缓冲区使用AudioTrack.write 写入OutputBuffer
  • 非隧道播放音频效果很好。
  • audio_hal 不会在日志中产生任何错误。

问题

我研究了ExoPlayer 的实现,发现在隧道播放中将缓冲区写入AudioTrack 之前使用了同步标头。

ByteBuffer avSyncHeader = ByteBuffer.allocate(16);
avSyncHeader.order(ByteOrder.BIG_ENDIAN);
avSyncHeader.putInt(0x55550001);
avSyncHeader.putInt(4, size);
avSyncHeader.putLong(8, presentationTimeUs * 1000);
avSyncHeader.position(0);
audioTrack.write(avSyncHeader, avSyncHeader.remaining(), WRITE_NON_BLOCKING);

我也尝试添加该标题,但仍然没有听到音频。

这个同步标头是否必要?

多媒体隧道还有其他未记录的要求吗?

【问题讨论】:

    标签: android android-mediaplayer android-mediacodec audiotrack


    【解决方案1】:

    Avsync 标头用于关卡 SDK,您可以使用另一个 AudioTrack.write 来写入每个缓冲区的时间戳。它可以自动生成 AV 同步标头。 使用另外一个可以写时间戳的API。

    试试:

    int write(ByteBuffer audioData, int sizeInBytes, int writeMode, long timestamp)
    

    将音频数据写入音频接收器,以便在 HW_AV_SYNC 轨道上以流模式播放

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-07
      • 2013-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多