【问题标题】:Recording Stream being played on Android在 Android 上播放的录制流
【发布时间】:2017-03-27 18:53:13
【问题描述】:

我正在 Android 中开发一个使用 MediaPlayer 播放 Shoutcast 流的应用程序。我需要将播放的流以 MP3 格式并行录制到 SD 卡中

Android 有出路吗?是否有任何示例代码可用于实现此目标

【问题讨论】:

  • @user669231:我希望流内容是非版权/公共领域的,否则您有权录制它。
  • 这属于公共领域...请提出技术可行性和解决方法
  • @user669231:好的,可能的方法是不使用 MP 实时播放并尝试并行写入 SD 卡。我不认为这是可能的。而是缓冲到 SD 卡上的文件(最终将成为录音),然后使用 MP 从缓冲文件播放。
  • 好吧,我已经开发了这个应用程序,它使用内置的 MediaPlayer 播放流。这些是 MP3 流,因此播放器本身支持它们现在,如果我必须自己开始读取流,保存它然后从磁盘播放它,这将意味着应用程序的架构发生了完整的变化。更不用说在自定义应用程序时可能会遇到的额外挑战,我希望我在这里澄清了这一点:-(当媒体播放器播放流时,是否有其他替代方法可以并行保存流?跨度>

标签: android streaming shoutcast


【解决方案1】:

我曾经用 Last.FM 播放器来做这个(当它实际工作时)。然而,这并不是一种简单的记录方式。

步骤一:写代理,带录流功能

第 2 步:root 手机

第 3 步:在手机上运行:

iptables -t nat -N proxy
iptables -t nat -A OUTPUT -m owner --uid-owner (uid of streaming app) -p tcp -j proxy
iptables -t nat -A proxy -p tcp -j DNAT --to proxyip:port

我的“第 1 步”是用 perl 编写的,而且相当混乱。对于直播,可能已经有录音代理可用。

【讨论】:

  • 感谢您的回答,我需要更多详细信息。可能是帮助链接
【解决方案2】:

我正在做类似的事情并面临同样的问题。

我可以播放流,但录制部分有问题,我假设我必须逐位读取流并将其保存到文件中。到目前为止,这是我的录音方法。

附:录制时不要忘记权限。

    private void startRecording() {
    String fileName = Environment.getExternalStorageDirectory().getAbsolutePath();
    fileName += "/FM-Recording-"+recordFile;
    mRecorder = new MediaRecorder();
    //mRecorder.setAudioSource(mediaPlayer.getAudioSessionID());
    mRecorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);
    mRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
    mRecorder.setOutputFile(fileName);
    mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

    try {
        mRecorder.prepare();
    } catch (IOException e) {
        Log.e(LOG_TAG, "prepare() failed "+e.toString());
    }

    mRecorder.start();
}

   private class RecorderThread extends Thread {
    public void go(){
        runOnUiThread (new Thread(new Runnable() {
            public void run() {
                isRecording = true;
                startRecording();
            }
        }));
    }
    }

这是布局: Application Layout

【讨论】:

    【解决方案3】:

    或者实现类似的东西

      private void startRecording() {
    
        BufferedOutputStream writer = null;
        try {
            URL url = new URL(RADIO_STATION_URL);
            URLConnection connection = url.openConnection();
    
            writer = new BufferedOutputStream(new FileOutputStream(new File(fileName)));
            recordingStream = connection.getInputStream();
    
            final int BUFFER_SIZE = 100;
    
            byte[] buffer = new byte[BUFFER_SIZE];
    
            while (recordingStream.read(buffer, 0, BUFFER_SIZE) != -1 && isRecording) {
                writer.write(buffer, 0, BUFFER_SIZE);
                writer.flush();
            }
    
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                recordingStream.close();
                writer.flush();
                writer.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多