ExoPlayer在某些设备上不能播放声音

3
我将尝试使用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_OFFEXTENSION_RENDERER_MODE_PREFER,但没有成功。

这是在将扩展程序导入示例项目到我的项目后出现的。

这是一个ffmpeg问题吗?如果我必须从头开始构建扩展程序,是否有任何方法可以在Windows上进行?在我的电脑上安装Linux有些困难。并且是否有任何教程可以根据我的流信息正确地完成此操作?

ExoPlayer是一个很棒的媒体播放器,但它确实缺乏文档(或者很难找到)。


请提供您使用的流媒体协议的详细信息(UDP、DASH等)。同时,请说明您使用的ffmpeg命令和参数以获取流信息。 - PrashanD
我真的不知道如何找到协议,但我已经更新了我的问题(顶部代码),包括使用的命令和流的URL。 - hiddeneyes02
除了 Exoplayer 库的外观部分,我同意你的看法,它的文档不够完善。你尝试过重写 onPlayerError 方法是否会收到任何错误信息? - PrashanD
@PrashanD 我正在等待报告的到来,因为它在离我很远的设备上,而我正在使用我的Web服务器上的ACRA来存储这些报告。 - hiddeneyes02
2个回答

2

您可以通过将ExoPlayer.EventListener附加到您的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;
        }
    }

一旦您收到错误信息,请更新您的问题。


抱歉回复晚了,但这个回调从未被调用。 - hiddeneyes02
似乎 Exoplayer 框架没有明确的错误与未播放声音有关。由于已经过去将近两年了,您可以尝试使用更新版本的 Exoplayer 进行检查。如果错误仍然存在,您可以在 Github 上开一个 issue 进行反馈。 - PrashanD

1

简而言之,ExoPlayer没有内置音频或视频编解码器。它使用设备本身的原生编解码器。这意味着如果设备缺少流的音频编解码器,则无法播放声音。您可以使用ffmpeg扩展来避免这种情况。但是正如您已经注意到的那样,您需要自己构建它。

请参阅https://exoplayer.dev/supported-formats.htmlhttps://developer.android.com/guide/topics/media/media-formats#core

此外,您还可以使用不同的音频编解码器对流进行转码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接