如何播放音频流(而非URL)?

时间:2017-06-19 21:25:07

标签: android audio-streaming shoutcast opensl

说,我有一个InputStream,提供audio / mpeg(或音频/ aacp) - 一个Shoutcast收音机。
有人可以给我看一个播放这样一个流的代码示例吗? 我在互联网上搜索,看起来android.media.MediaPlayer不能播放缓冲流。它只能通过HTTP URL作为DataSource播放流 是的,有可能实现自己的android.media.MediaDataSource并将其提供给MediaPlayer.setDataSource(),但是在audio / aacp的情况下编解码器could not initialize

猜猜这可以用OpenSL ES来完成,但我还是找不到任何可以从InputStream执行解码的示例(不是来自URL),然后回放输出..

<小时/> 拜托了伙计们! OpenSL ES中的任何样本片段解码输入字节数组并将其发送到音频输出。请!
只有一个条件 - 输入音频格式应该从输入流中获得 我在OpenSL ES找到的唯一一本手册是Khronos OpenSL ES™ Registry,但这根本不适合初学者阅读。我宁愿死在那里寻找一个合适的&#34;操作方法&#34;例子...... :(

为什么它如此奇怪 - 它非常简单/虽然不方便/(java),或者非常硬(NDK)?为什么中间没有任何东西?

1 个答案:

答案 0 :(得分:0)

你的解决方案是这样的:

    public void run() {
        int buffersize = AudioRecord.getMinBufferSize(11025, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT);
        AudioTrack atrack = new AudioTrack(AudioManager.STREAM_MUSIC, 11025, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT, buffersize, AudioTrack.MODE_STREAM);
        atrack.setPlaybackRate(11025);
        byte[] buffer = new byte[buffersize];
        atrack.play();
        while (isPlaying) {
            yourStream.read(buffer, 0, buffersize);
            atrack.write(buffer, 0, buffer.length);
        }
    }