让 exoPlayer 2.0 通过扬声器播放

Posted

技术标签:

【中文标题】让 exoPlayer 2.0 通过扬声器播放【英文标题】:Making exoPlayer 2.0 to play through a speakerphone 【发布时间】:2017-03-04 18:15:17 【问题描述】:

所以我正在开发一个闹钟应用程序,当我在设备中有耳机插孔时,我无法让 exoplayer 使用免提电话。我找到了this solution,但正如 cmets 所说,这实际上并不是一种可靠的方法。我还发现有人有类似的问题here 并且有一个方法SimpleExoPlayer.setAudiostreamType(),但不幸的是它在 ExoPlayer 2.0.4 中不起作用。有什么想法吗?

【问题讨论】:

【参考方案1】:

好的,我找到了解决方案!创建 exoPlayer 时,您可以使用默认渲染器(这就是 ExoPlayerFactory.newSimpleInstance() 的用途)或创建自己的渲染器来执行特定操作。默认音频渲染器(MediaCodecAudioRenderer)的问题在于它默认设置了AudioManager.STREAM_MUSIC,而 ExoPlayer 2.x 没有任何方法可以更改它(尽管 ExoPlayer 1.x 中有这样的方法)。

为了解决这个问题,我必须创建自己的音频渲染器并将AudioManager.STREAM_ALARM 作为其参数之一传递。之后,您可以使用ExoPlayerFactory.newInstance() 并将创建的渲染器传递给它。

这是一个类,您可以使用它来获取 ExoPlayer 的实例,该实例将始终通过免提电话播放音乐。它还将使用警报音量级别。

public class AlarmExoPlayerFactory 

    public static ExoPlayer newInstance() 
        Renderer[] renderers = new Renderer[1];

        Renderer audioRenderer = new MediaCodecAudioRenderer(MediaCodecSelector.DEFAULT, null, true,
                null, null, null, AudioManager.STREAM_ALARM);
        renderers[0] = audioRenderer;

        Handler handler = new Handler();
        TrackSelector trackSelector = new DefaultTrackSelector(handler);
        return ExoPlayerFactory.newInstance(renderers, trackSelector);
    

【讨论】:

以上是关于让 exoPlayer 2.0 通过扬声器播放的主要内容,如果未能解决你的问题,请参考以下文章

通过 ExoPlayer 或其他选项播放多个音频文件?

iOS 无法在扬声器上播放并将音频会话设置为录制

音视频开发之旅(45)-ExoPlayer 音频播放器实践

在 CastSDK v3 上设置播放速度

ExoPlayer 2 的质量选择器

ExoPlayer onResume() 恢复播放状态