簡體   English   中英

需要將audio byte []編碼為要通過JSON傳輸的字符串。 將從C#編碼和發送,並在Java中作為音頻字節讀取

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM