[英]Need to encode audio byte[] as string to be transferred via JSON. Will be encoded and sent from C# and read as audio bytes in Java
所以我發現了很多類似的問題,它們似乎歸結為對你使用的編碼格式的看法不同。 我試過Base64和UTF-8。 當我使用Base64時,當我解碼它們時,字節似乎在Java端完全改變,聲音基本上只是靜態噪聲。 然而,當我使用UTF-8時,我仍然可以聽到那里的原始聲音,但它非常扭曲和嘈雜,幾乎聽不見,但絕對還在那里。 我認為這是因為UTF-8沒有許多音頻字節的字符,因此在編碼和解碼過程中丟失了許多字符,這就是我嘗試使用base64的原因,但這會導致更糟糕的音頻。 我正在播放實時麥克風音頻,所以我沒有音頻文件,我可以比較字節到編碼類型后到達Java。
整個想法是我想將JSON字符串中的音頻字節打包,以便從C#發送到Java,而不是單獨流式處理原始音頻字節(這完全正常)。 我想這樣做的原因是因為我希望能夠傳達其他非音頻內容,並且還計划使用JSON。
有沒有更好的方法將音頻編碼為我可以在JSON中使用的字符串? 或者音頻字節基本上會導致數據丟失,無論如何嘗試將它們編碼為字符串?
對於我的base64嘗試,在C#中我使用:
Convert.ToBase64String(byteBuffer);
在Java方面,我嘗試解碼
DatatypeConverter.parseBase64Binary(audioBufferData);
和
BASE64Decoder decoder = new BASE64Decoder();
byte[] bufferBytes = decoder.decodeBuffer(audioBufferData);
對於UTF-8,我在C#中使用過
Encoding.UTF8.GetString(byteBuffer);
在Java中
audioBufferData.getBytes("UTF-8");
我在Unity中使用一個名為“NatMic”的資產來獲取實時麥克風輸入。 它給了我一個float [] sampleBuffer,它被轉換為字節,如下所示:
var shortBuffer = new short[sampleBuffer.Length];
var byteBuffer = new byte[Buffer.ByteLength(shortBuffer)];
for (int i = 0; i < sampleBuffer.Length; i++)
shortBuffer[i] = (short)(sampleBuffer[i] * short.MaxValue);
Buffer.BlockCopy(shortBuffer, 0, byteBuffer, 0, byteBuffer.Length);
然后byteBuffer如上編碼並發送到服務器。 如果我發送沒有編碼的字節並使用Java中的Little Endian格式SourceDataLine直接播放它,聽起來很完美,但在編碼到base64后,我必須更改SourceDataLine的格式以期望Big Endian正確播放。 由於其他原因,我必須保持Little Endian訂單。
Base64將直接編碼您提供的字節,不會導致問題。 最有可能的問題是字節序,兩端各有不同。 兩端的轉換和轉換需要相同。 您尚未顯示如何從16位音頻數據中獲取字節緩沖區,因此無法建議對該部分進行任何更正。
默認情況下,Java是大端,而.NET不管底層架構是什么,通常都是小端,因此需要在某些時候進行交換。 Java的ByteBuffer
支持設置字節序,因此可能有所幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.