1

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

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

4

3 回答 3

0

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

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

第2步:root你的手机

第三步:在手机上运行:

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 编写的,而且相当混乱。对于直播,可能已经有录音代理可用。

于 2011-04-24T12:42:38.317 回答
0

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

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

PS 录制时不要忘记权限。

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

这是布局: 应用程序布局

于 2017-03-27T10:28:49.217 回答
0

或者实现这样的东西

  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();
        }
    }
}
于 2017-03-27T10:53:13.560 回答