2011-04-04 63 views
1

我正在開發Android中的應用程序,播放使用MediaPlayer的Shoutcast流。我有一個要求以MP3格式將播放的流並行錄製到SD卡上在Android上播放的錄製流

Android有什麼出路嗎?有沒有任何示例代碼可以實現這個

+0

@ user669231:我希望流內容是無版權/公共領域,或者您有權限來記錄它。 – Squonk 2011-04-04 19:56:29

+0

這是在公共領域...請建議技術可行性和解決方案 – user669231 2011-04-04 20:42:32

+0

@ user669231:好的,可能的方法是不要與MP一起玩,並嘗試並行寫入SD卡。我不認爲這是可能的。而是緩衝到SD卡上的文件(最終將成爲錄製文件),然後使用MP從緩衝區文件播放。 – Squonk 2011-04-04 20:51:28

回答

0

我曾經用Last.FM播放器(當它實際工作時)做到這一點。然而,這不是一種簡單的錄音手段。

第1步:寫碼流記錄功能的代理

第2步:根手機

第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編寫:在手機上運行,而且相當混亂。對於shoutcast,可能有一個錄製代理已經可用。

+0

感謝您的回答,我需要更多的細節。可能是幫助鏈接 – user669231 2011-04-30 02:42:59

0

我正在做類似的事情,面臨同樣的問題。

我能夠播放流,但我有錄音部分的麻煩,我假設我必須逐位讀取流並將其保存到文件。到目前爲止,這是我的錄音方法。

P.S.記錄時不要忘記權限。

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

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