2

我正在開發一種低數據速率的VoIP類項目。我需要以低數據速率捕捉音頻並將其存儲在內部緩衝區或FIFO(不在文件中)。使用MediaRecorder寫入緩衝區或FIFO

我想使用低數據速率.AMR編碼器,這意味着AudioRecord不在了。 MediaRecorder看起來像它正是我想要的,只是它似乎寫入一個文件。

MediaRecorder需要一個FileDescriptor ...有沒有什麼辦法可以編寫一個實現FileDescriptor接口的類......充當字節的同步......但不是將它們發送到文件,而是將它們存儲在緩衝?關於FileDescriptor的文檔特別指出,應用程序不應該自己寫,但爲什麼不可以,而且有可能呢?

http://docs.oracle.com/javase/1.4.2/docs/api/java/io/FileDescriptor.html

總之,我想發展我自己的流,並誘騙MediaRecorder將數據發送給它。也許做一些棘手的事情,打開同一個APK中的套接字的兩端,並給MediaRecorder套接字寫入?使用套接字作爲我的FIFO?我對此有點新,所以任何幫助/建議非常感謝。

我在RX方面有一個相關的問題。我想有一個緩衝區/ FIFO提供MediaPlayer。我可以欺騙MediaPlayer接受來自由我自己的專有流提供的緩衝區中的數據嗎?

回答

3

我知道它現在有點遲,現在要回答這個問題... ...但如果這有助於解決方案。

Android MediaRecorder的方法setOutputFile()接受FileDescriptor作爲參數。 至於你需要一個unix數據管道可以創建和FD可以作爲以下方式的參數傳遞...

mediaRecorder.setOutputFile(getPipeFD()); 

FileDescriptor getPipeFD() 
{ 
    final String FUNCTION = "getPipeFD"; 
    FileDescriptor outputPipe = null; 

    try 
    { 
     ParcelFileDescriptor[] pipe = ParcelFileDescriptor.createPipe(); 
     outputPipe = pipe[1].getFileDescriptor(); 
    } 
    catch(Exception e) 
    { 
     Log.e(TAG, FUNCTION + " : " + e.getMessage()); 
    } 

    return outputPipe; 
} 

ParcelFileDescriptor.createPipe()創建一個Unix數據通道和返回ParcelFileDescriptors的數組。第一個對象是指讀通道(源通道),第二個對象是指管道的寫通道(Sink Channel)。使用MediaRecorder對象將記錄的數據寫入寫入通道...

就MediaPlayer而言,通過將與創建的管道讀取通道相關的FileDescriptor對象傳遞給setDataSource()方法,可以使用相同的技術...

+1

試過了。它不起作用。至少不適用於MediaRecorder。 – binW