2015-11-27 75 views
0

我試圖在錄製時以mp3格式流式傳輸音頻,但是我無法實現良好的流式傳輸質量。如何在naudio中按幀流式傳輸mp3幀

我正在做的是從「WI_DataAvailable」獲取10秒的PCM數據並將其轉換爲MP3,然後在網絡中發送幀。它在10秒的數據之間幾乎沒有發生任何沉默。

我喜歡在錄製時按流繼續播放幀。有沒有合適的方法?

+0

你是否每個人編碼10秒的MP3?如果是這樣,由於mp3的限制(mp3不能任意長度,並且必須是幀大小的倍數,通常是1152個樣本),您將永遠無法將它們「端對端」地對接起來。您還需要考慮編碼器存在「加速」時間,這意味着您會在邊界處聽到可聽到的文物。您需要連續對音頻進行編碼,而不是每10秒鐘開始一次新的編碼會話。 – spender

+0

是的,我每個人編碼10秒。但如何編碼和獲取幀同時發送幀到網絡?通過使用LameMP3FileWriter,我只能寫入流。有沒有其他方法呢? – Aran

+0

我曾寫過一個MP3流媒體,但在一臺舊電腦上(我虛擬化)。我會看看它是否存在... – spender

回答

0

鑑於LameMP3FileWriter需要Stream來寫入,我建議實現自己的流類,並簡單地將所有到達Write方法的數據寫入UDP。然後你可以把它傳遞給LameMP3FileWriter。

下面是一個基本的流類,應該讓你開始。您需要填寫方法Write的空白,並可能需要填寫Flush。我想你可以把所有的東西都保留爲NotImplemented。

public class UdpStream:Stream 
{ 
    public override int Read(byte[] buffer, int offset, int count) 
    { 
     //you'll definitely need to implement this... 
     //write the buffer to UDP 
    } 

    public override void Flush() 
    { 
     //you might need to implement this 
    } 

    public override bool CanRead 
    { 
     get { return false; } 
    } 

    public override bool CanSeek 
    { 
     get { return false; } 
    } 

    public override bool CanWrite 
    { 
     get { return true; } 
    } 

    public override long Seek(long offset, SeekOrigin origin) 
    { 
     throw new NotImplementedException(); 
    } 

    public override void SetLength(long value) 
    { 
     throw new NotImplementedException(); 
    } 


    public override void Write(byte[] buffer, int offset, int count) 
    { 
     throw new NotImplementedException(); 
    } 

    public override long Length 
    { 
     get { throw new NotImplementedException(); } 
    } 

    public override long Position { 
     get{throw new NotImplementedException();} 
     set{throw new NotImplementedException();} 
    } 
} 
+0

我對FLASH有點困惑實際上在做什麼流 – Aran

+0

@Aran:你可能會在Flush看不到任何東西,因爲你可能不需要緩衝任何東西......只需寫入在Write方法中所有的東西都用到UDP上,你應該很好。我很想聽聽這是如何解決你的。 – spender

+0

@Aran:當然,如果LameMP3FileWriter實際上使用'Position'屬性混淆了,你將會回到繪圖板。我沒有檢查。 – spender