天天看點

java音視訊編解碼問題:16/24/32位位音頻byte[]轉換為小端序short[],int[],以byte[]轉short[]為例JavaCV實戰專欄文章目錄(JavaCV速查手冊)前言1、Java中使用ByteOrder.LITTLE_ENDIAN表示小端序,ByteOrder.BIG_ENDIAN表示大端序2、java中的大小端序轉換

javacv實戰專欄目錄:

JavaCV實戰專欄文章目錄(JavaCV速查手冊)

前言

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);

如果覺得部落客寫得還不錯,歡迎“關注、收藏、點贊”一鍵三連!

end

其他JavaCV專欄推薦:

JavaCV入門指南專欄

JavaCV入門指南:序章(看完本章後,不想看原理的小夥伴可直接跳轉到《快速上手篇》)

JavaCV入門指南:調用FFmpeg原生API和JavaCV是如何封裝了FFmpeg的音視訊操作

JavaCV入門指南:調用opencv原生API和JavaCV是如何封裝了opencv的圖像處理操作

JavaCV入門指南:幀抓取器(FrameGrabber)的原理與應用

JavaCV入門指南:幀錄制器/推流器(FrameRecorder)的原理與應用

JavaCV入門指南:幀過濾器(FrameFilter)的原理與應用

JavaCV入門指南:FrameConverter轉換工具類及CanvasFrame圖像預覽工具類

《快速上手篇》(為了差別,單獨劃分):

JavaCV入門指南之快速上手篇:快速上手視訊拉流、推流、錄制檔案、錄屏、截圖和編解碼複用解複用等常用音視訊處理操作

javacv進階tesserac文字識别系列:

javaCV文字識别之1:基于google的tesserac ocr識别圖檔中的文字,跨平台支援英文中文簡體繁體等各種字元識别

javaCV文字識别之2:視訊文字識别和視訊提取字幕文字字元

javacv進階ffmpeg系列:

javacpp-FFmpeg系列之1:視訊拉流解碼成YUVJ420P,并儲存為jpg圖檔

javacpp-FFmpeg系列之2:通用拉流解碼器,支援視訊拉流解碼并轉換為YUV、BGR24或RGB24等圖像像素資料

javacpp-FFmpeg系列之3: 圖像資料轉換(BGR與BufferdImage互轉,RGB與BufferdImage互轉)

javacpp-FFmpeg系列補充:FFmpeg解決avformat_find_stream_info檢索時間過長問題

javacv進階opencv系列:

javaCV圖像處理之1:實時視訊添加文字水印并截取視訊圖像儲存成圖檔,實作文字水印的字型、位置、大小、粗度、翻轉、平滑等操作

javaCV圖像處理之2:實時視訊添加圖檔水印,實作不同大小圖檔疊加,圖像透明度控制

javacv圖像處理3:使用opencv原生方法周遊攝像頭裝置及調用(友善多攝像頭周遊及調用,相比javacv更快的攝像頭讀取速度和效率,友善讀取後的圖像處理)

javacv圖像處理系列:國内車輛牌照檢測識别系統(萬份測試準确率99.7%以上)

javacv人臉檢測識别:

JavaCV進階opencv圖像處理:攝像頭畫面人臉檢測

JavaCV進階opencv圖像處理:ffmpeg視訊圖像畫面人臉檢測

JavaCV進階opencv圖像處理:批量人臉圖像分類訓練

JavaCV進階opencv圖像處理:攝像頭圖像人臉識别

繼續閱讀