【问题标题】:How do I playback an audio stream (not by URL)?如何播放音频流(不是通过 URL)?
【发布时间】:2017-11-22 05:44:18
【问题描述】:

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

猜想这可以通过OpenSL ES 完成,但我仍然没有找到任何可以从 InputStream(不是从 URL)执行解码,然后播放输出的示例。


拜托了伙计们! OpenSL ES 中的任何样本 sn-p 解码输入字节数组并将其发送到音频输出。请!
只有一个条件 - 应从输入流中获取输入音频格式。
我在OpenSL ES 上找到的唯一一本手册是Khronos OpenSL ES™ Registry,但这根本不适合初学者阅读。我宁愿死在那里寻找合适的“操作方法”示例... :(

为什么这么奇怪 - 它是非常简单/虽然不方便/(java),还是非常困难(NDK)?为什么中间什么都没有?

【问题讨论】:

  • “我在整个互联网上搜索,看起来 android.media.MediaPlayer 无法播放缓冲流” - 这是因为媒体播放在与您的不同进程中运行.您的MediaDataSource 方法似乎是正确的。由于 Android 的源代码可用,请将您使用 URL 的方式与 Android 本身的使用方式进行比较(如果您直接传递 URL)。
  • @CommonsWare 在内部,MediaPlayer.setDataSource(URL) 调用私有原生函数 nativeSetDataSource(MediaHTTPService.createHttpServiceBinderIfNecessary(path), path, keys, values); (路径包含 URL;键和值包含 HTTP 请求标头的数据)。所以,没有办法进去看看..

标签: android audio-streaming shoutcast opensl


【解决方案1】:

你的解决方案是这样的:

    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);
        }
    }

【讨论】:

  • 等等。即使我的 InputStream 包含 - 例如 - MP3 帧序列,也不需要解码它?只写AudioTrack?我想我应该将已经解码的 PCM 写入它,而不是原始源..
猜你喜欢
  • 2019-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多