2017-05-28 121 views
10

我有一个使用MediaPlayer的应用程序,可以在播放渐进式下载MP3时正常工作。我试图使用相同的应用程序来分发进度下载AAC文件。它播放的文件很好。什么不工作是当我尝试使用MediaPlayer.seekTo()与AAC在流中跳过时。这再次在MP3中正常工作。对于AAC流,它只是重新开始播放零。如何使用Android MediaPlayer通过http流进行AAC搜索?

我的感觉是编码有关。该AAC文件尚未正确配置为流式传输。

下面是从的MediaInfo工具的输出:

Size: 2.3 MB 
Format: QuickTime/MPEG-4/Motion JPEG 2000 format 
Stream count: 2 
Duration: 00:05:02 
Bit rate: 64 kb/s 
Meta info: 
    album_artist: Red Hot Chili Peppers 
    album: The Getaway 
    minor_version: 512 
    encoder: Lavf57.41.100 
    title: Dark Necessities 
    major_brand: M4V 
    track: 2 
    disc: 1 
    compatible_brands: isomiso2avc1 
    artist: Red Hot Chili Peppers 
    copyright: 2016 Warner Bros. Records Inc. 
    genre: Alternative 

Stream 0 
Type: video 
Codec: h264 
Codec profile: High 10 
FourCC: avc1 
Duration: 00:00:00 
Width: 350 
Height: 350 
Sample aspect ratio: 1:1 
Display aspect ratio: 1:1 
Pixel format: yuv420p10le 
Frame rate: 90000 fps 
Meta info: 
    handler_name: VideoHandler 
    language: und 

Stream 1 
Type: audio 
Codec: aac 
FourCC: mp4a 
Duration: 00:05:02 
Bit rate: 64 kb/s 
Sample rate: 44100 Hz 
Sample format: s16 
Channel: 2 
Meta info: 
    handler_name: SoundHandler 
    language: und 

你会发现它真的与AAC音频和没有真正的视频的视频文件包括在内。如果是这样的话,我想它需要更多的元数据来知道在哪里播放,当我要求可能会或可能不会被加载的流的一部分。此外,视频需要关键帧才能知道播放位置,因此我相信流/文件中不包含任何关键帧或“提示”框。

我还没有找到任何关于什么是缺失或如果这是可能的真实细节运气。我已经在其他版本上测试过它,它似乎在5.0.2之前运行。在5.0.2之后它不起作用。我还没有找到有关该版本中更改内容的任何详细信息。

因此,这可能是流编码问题,不允许我们通过渐进式下载http(s)流来传输此文件。或者,它可能是5.0.2时间段左右创建的Android媒体播放器中的一个错误。或者它可能是两个。

为什么不能正常工作?

+0

有没有反正流输出作为原始AAC(与ADTS标头),而不是M4A/MP4内包含的音频? MP3正在工作,因为你得到的MP3帧(每个是几毫秒的声音),所以你只是跳过帧来寻求。 AAC也是框架(如果你没有放入容器内)。我不太熟悉Android SDK,但我相信你可以发送帧的字节到SDK解码器。我会调查一些选项。 –

+0

我在Android的播放器中获得了对ADTS支持的混合消息,所以我不确定它是否有效。我期待着听到你发现的内容。 – chubbsondubs

+0

你有一个样本流链接检查? –

回答

1

尝试用Exoplayer,就这么简单

ExoPlayer拥有Android的内置MediaPlayer的许多优点:

  • 支持动态自适应流HTTP(DASH)和SmoothStreaming,这两者都不MediaPlayer支持它(它也支持HTTP实时流(HLS),MP4,MP3,WebM,M4A,MPEG-TS和AAC)。
  • 支持高级HLS功能,例如正确处理#EXT-X-DISCONTINUITY标记。
  • 能够自定义和扩展播放器以适合您的使用案例。 ExoPlayer是专门为此设计的,允许将许多组件替换为自定义实现。
  • 轻松更新播放器以及您的应用程序。由于ExoPlayer是一个包含在应用程序apk中的库,因此您可以控制使用哪个版本,并且可以轻松地将其更新为新版本,作为常规应用程序更新的一部分。
+0

这是另一种选择,但我对Android SDK中有关AAC流支持的答案非常感兴趣。我知道我可以撕掉现有的代码并尝试用某种东西代替它,但是交换你认为是魔鬼的魔鬼,你并不真的不回答我关于流式传输的问题。 – chubbsondubs

+0

是的,它是可选的,用于流式传输的备用解决方案。我对你的意图感到抱歉。 –