我試圖在錄製時以mp3格式流式傳輸音頻,但是我無法實現良好的流式傳輸質量。如何在naudio中按幀流式傳輸mp3幀
我正在做的是從「WI_DataAvailable」獲取10秒的PCM數據並將其轉換爲MP3,然後在網絡中發送幀。它在10秒的數據之間幾乎沒有發生任何沉默。
我喜歡在錄製時按流繼續播放幀。有沒有合適的方法?
我試圖在錄製時以mp3格式流式傳輸音頻,但是我無法實現良好的流式傳輸質量。如何在naudio中按幀流式傳輸mp3幀
我正在做的是從「WI_DataAvailable」獲取10秒的PCM數據並將其轉換爲MP3,然後在網絡中發送幀。它在10秒的數據之間幾乎沒有發生任何沉默。
我喜歡在錄製時按流繼續播放幀。有沒有合適的方法?
鑑於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();}
}
}
你是否每個人編碼10秒的MP3?如果是這樣,由於mp3的限制(mp3不能任意長度,並且必須是幀大小的倍數,通常是1152個樣本),您將永遠無法將它們「端對端」地對接起來。您還需要考慮編碼器存在「加速」時間,這意味着您會在邊界處聽到可聽到的文物。您需要連續對音頻進行編碼,而不是每10秒鐘開始一次新的編碼會話。 – spender
是的,我每個人編碼10秒。但如何編碼和獲取幀同時發送幀到網絡?通過使用LameMP3FileWriter,我只能寫入流。有沒有其他方法呢? – Aran
我曾寫過一個MP3流媒體,但在一臺舊電腦上(我虛擬化)。我會看看它是否存在... – spender