Как сделать AAC доступным для HTTP-потока с помощью Android MediaPlayer?

У меня есть приложение, использующее MediaPlayer, который отлично работает при потоковой загрузке MP3 файлов. Я попытался использовать то же приложение для потоковой загрузки файлов AAC. И он отлично воспроизводит файлы. Что не работает, когда я пытаюсь пропустить в потоке, используя MediaPlayer.seekTo() с AAC. Это снова отлично работает в mp3. Для потока 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 с прогрессивной загрузкой. Или это может быть ошибкой в ​​Android Media Player, созданной примерно в 5.0.2 таймфрейма. Или это может быть и то, и другое.

Почему это не работает?

Ответ 1

Попробуйте с ExoPlayer, это так просто

ExoPlayer имеет ряд преимуществ перед андроидами, встроенными в MediaPlayer:

  • Поддержка динамической адаптивной потоковой передачи через HTTP (DASH) и SmoothStreaming, ни одна из которых не поддерживается MediaPlayer (она также поддерживает потоки HTTP Live (HLS), MP4, MP3, WebM, M4A, MPEG-TS и AAC).
  • Поддержка расширенных функций HLS, таких как правильная обработка тегов # EXT-X-DISCONTINUITY.
  • Возможность настраивать и расширять плеер в соответствии с вашим вариантом использования. ExoPlayer специально разработан с учетом этого и позволяет заменить многие компоненты пользовательскими реализациями.
  • Легко обновлять плеер вместе с вашим приложением. Поскольку ExoPlayer - это библиотека, которую вы добавляете в приложение apk, у вас есть контроль над версией, которую вы используете, и вы можете легко обновить ее до более новую версию как часть обычного обновления приложения.