java音影片編解碼問題:16/24/32位位音頻byte[]轉換為小端序short[],int[],以byte[]轉short[]為例
- 2019 年 11 月 1 日
- 筆記
版權聲明:本文為部落客原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
本文鏈接:https://blog.csdn.net/eguid_1/article/details/52790848
前言:Java默認採用大端序存儲方式,實際編碼的音頻數據是小端序,如果處理單8bit的音頻當然不需要做轉換,但是如果是16bit或者以上的就需要處理成小端序位元組順序。
註:大、小端序指的是位元組的存儲順序是按從高到低還是從低到高的順序存儲,與處理器架構有關,Intel的x86平台是典型的小端序存儲方式
1、Java中使用ByteOrder.LITTLE_ENDIAN表示小端序,ByteOrder.BIG_ENDIAN表示大端序
小端序:數據的高位位元組存放在地址的低端 低位位元組存放在地址高端
大端序:數據的高位位元組存放在地址的高端 低位位元組存放在地址低端
大端序是按照數字的書寫順序進行存儲的,而小端序則是反順序進行存儲的。
Big-endian 存放順序(順序存儲) 0x00000001 — 12 0x00000002 — 34 0x00000003 — 56 0x00000004 — 78 Little-endian 存放順序(反序儲存) 0x00000001 — 78 0x00000002 — 56 0x00000003 — 34 0x00000004 — 12
2、java中的大小端序轉換
例如byte[]轉成short[]:
假設data作為源音頻數據,是一個byte[]
int dataLength=data.length;
//byte[]轉成short[],數組長度縮減一半
int shortLength=dataLength/2;
//把byte[]數組裝進byteBuffer緩衝
ByteBuffer byteBuffer=ByteBuffer.wrap(data, 0,dataLength);
//將byteBuffer轉成小端序並獲取shortBuffer
ShortBuffer shortBuffer=byteBuffer.order(ByteOrder.LITTLE_ENDIAN).asShortBuffer();
short[] shortSamples=new short[shortLength];
//取出shortBuffer中的short數組
shortBuffer.get(shortSamples,0,shortLength);