ExoPlayer не воспроизводит звук на некоторых устройствах

Я пытаюсь создать потоковое приложение с помощью ExoPlayer на Android. Большинство потоков работает нормально, только некоторые из них не воспроизводят звук только на некоторых устройствах.

Вот информация о потоке, извлеченная с помощью этой команды:

ffprobe -v error -show_format -show_streams http://nasaiptv.com:8000/live/qSplUhwfcy/bE43JqZPSt/477.ts

[STREAM]
index=0
codec_name=mpeg2video
codec_long_name=MPEG-2 video
profile=Main
codec_type=video
codec_time_base=1/25
codec_tag_string=[2][0][0][0]
codec_tag=0x0002
width=720
height=576
coded_width=0
coded_height=0
has_b_frames=1
sample_aspect_ratio=16:15
display_aspect_ratio=4:3
pix_fmt=yuv420p
level=8
color_range=tv
color_space=unknown
color_transfer=unknown
color_primaries=unknown
chroma_location=left
field_order=progressive
timecode=N/A
refs=1
id=0x100
r_frame_rate=25/1
avg_frame_rate=25/1
time_base=1/90000
start_pts=3471311880
start_time=38570.132000
duration_ts=N/A
duration=N/A
bit_rate=N/A
max_bit_rate=N/A
bits_per_raw_sample=N/A
nb_frames=N/A
nb_read_frames=N/A
nb_read_packets=N/A
DISPOSITION:default=0
DISPOSITION:dub=0
DISPOSITION:original=0
DISPOSITION:comment=0
DISPOSITION:lyrics=0
DISPOSITION:karaoke=0
DISPOSITION:forced=0
DISPOSITION:hearing_impaired=0
DISPOSITION:visual_impaired=0
DISPOSITION:clean_effects=0
DISPOSITION:attached_pic=0
DISPOSITION:timed_thumbnails=0
[/STREAM]
[STREAM]
index=1
codec_name=mp2
codec_long_name=MP2 (MPEG audio layer 2)
profile=unknown
codec_type=audio
codec_time_base=1/48000
codec_tag_string=[3][0][0][0]
codec_tag=0x0003
sample_fmt=fltp
sample_rate=48000
channels=2
channel_layout=stereo
bits_per_sample=0
id=0x101
r_frame_rate=0/0
avg_frame_rate=0/0
time_base=1/90000
start_pts=3471301664
start_time=38570.018489
duration_ts=N/A
duration=N/A
bit_rate=112000
max_bit_rate=N/A
bits_per_raw_sample=N/A
nb_frames=N/A
nb_read_frames=N/A
nb_read_packets=N/A
DISPOSITION:default=0
DISPOSITION:dub=0
DISPOSITION:original=0
DISPOSITION:comment=0
DISPOSITION:lyrics=0
DISPOSITION:karaoke=0
DISPOSITION:forced=0
DISPOSITION:hearing_impaired=0
DISPOSITION:visual_impaired=0
DISPOSITION:clean_effects=0
DISPOSITION:attached_pic=0
DISPOSITION:timed_thumbnails=0
[/STREAM]
[FORMAT]
filename=http://nasaiptv.com:8000/live/qSplUhwfcy/AVbqREBSOh/477.ts
nb_streams=2
nb_programs=1
format_name=mpegts
format_long_name=MPEG-TS (MPEG-2 Transport Stream)
start_time=38570.018489
duration=N/A
size=N/A
bit_rate=N/A
probe_score=50
[/FORMAT]

И вот как я начинаю играть в потоке:

   private SimpleExoPlayer player;
   private PlayerView exoPlayer;

   private void initializePlayer() {
      exoPlayer = findViewById(R.id.exo_player);
      player = ExoPlayerFactory.newSimpleInstance(
            new DefaultRenderersFactory(this, EXTENSION_RENDERER_MODE_ON),
            new DefaultTrackSelector(),
            new DefaultLoadControl());

      player.addListener(listener);

      exoPlayer.setPlayer(player);

      player.setPlayWhenReady(true);

      Uri uri = Uri.parse(stream.getStreamUriString());

      MediaSource mediaSource = new ExtractorMediaSource.Factory(
            new DefaultHttpDataSourceFactory("exoplayer-codelab")).createMediaSource(uri);
      player.prepare(mediaSource, true, false);
   }

Я также пробовал с EXTENSION_RENDERER_MODE_OFF и с EXTENSION_RENDERER_MODE_PREFER, безуспешно.

Это после импорта расширений из пример проекта в мой проект.

Это проблема ffmpeg? Если мне нужно создать расширение с нуля, можно ли это сделать в Windows? Установка Linux на мой компьютер несколько проблематична. И есть ли какое-нибудь руководство, чтобы сделать это правильно, в соответствии с моей информацией о потоке?

ExoPlayer — отличный медиаплеер, но к нему действительно не хватает документации (или ее трудно найти).


person hiddeneyes02    schedule 11.06.2018    source источник
comment
Также предоставьте некоторые сведения о типе протокола потоковой передачи, который вы используете (UDP, DASH и т. д.). Также укажите команду и параметры, которые вы использовали для получения информации о потоке с помощью ffmpeg.   -  person PrashanD    schedule 12.06.2018
comment
Я действительно не знаю, как найти протокол, но я обновил свой вопрос (верхний код), указав используемую команду и URL-адрес потока.   -  person hiddeneyes02    schedule 12.06.2018
comment
Я согласен, за исключением поверхности библиотеки Exoplayer, она вообще плохо документирована. Получали ли вы какие-либо сообщения об ошибках при переопределении onPlayerError?   -  person PrashanD    schedule 15.06.2018
comment
@PrashanD Я жду поступления отчетов, потому что они находятся на устройстве очень далеко от меня, и я использую ACRA на своем веб-сервере для хранения отчетов.   -  person hiddeneyes02    schedule 15.06.2018


Ответы (2)


Вы можете попытаться получить подробную информацию об ошибке, подключив ExoPlayer.EventListner к вашему экземпляру SimpleExoPlayer и переопределив onPlayerError.

@Override
    public void onPlayerError(ExoPlaybackException error) {
        switch (error.type) {
            case ExoPlaybackException.TYPE_SOURCE:
                Log.e(TAG, "TYPE_SOURCE: " + error.getSourceException().getMessage());
                break;

            case ExoPlaybackException.TYPE_RENDERER:
                Log.e(TAG, "TYPE_RENDERER: " + error.getRendererException().getMessage());
                break;

            case ExoPlaybackException.TYPE_UNEXPECTED:
                Log.e(TAG, "TYPE_UNEXPECTED: " + error.getUnexpectedException().getMessage());
                break;
        }
    }

Как только вы получите сообщения об ошибках, обновите свой вопрос

person PrashanD    schedule 12.06.2018
comment
Извините за мой очень поздний ответ, но этот обратный вызов никогда не вызывался. - person hiddeneyes02; 31.03.2020
comment
Похоже, что в среде Exoplayer нет явной ошибки, связанной с тем, что звук не воспроизводится. Так как прошло уже почти два года... можете проверить с более новой версией Exoplayer. Если ошибка все еще сохраняется, вы можете открыть для этого проблему на github. - person PrashanD; 31.03.2020

Подводя итог: ExoPlayer не поставляется со встроенными аудио- или видеокодеками. Он использует собственные кодеки устройств, на которых он работает. Это означает, что если на устройстве отсутствует аудиокодек потока, у вас не будет звука. Вы можете избежать этого, используя расширение ffmpeg. Но, как вы уже заметили, сначала вам нужно построить его самостоятельно.

См. https://exoplayer.dev/supported-formats.html и https://developer.android.com/guide/topics/media/media-formats#core

Кроме того, вы можете перекодировать свой поток с помощью ffmepg, используя другой аудиокодек.

person Harry Developer    schedule 19.05.2021