java 视频转字节码_java音视频编解码问题:16/24/32位位音频byte[]转换为小端序short[],int[],以byte[]转short[]为例...

本文介绍了Java中处理音频数据时遇到的大端序和小端序问题,特别是针对16bit及以上位宽的数据。Java默认采用大端序,而Intel x86平台则是小端序。通过ByteBuffer,可以将byte[]转换为short[],并利用ByteOrder.LITTLE_ENDIAN实现小端序转换。转换过程包括创建ByteBuffer,设置字节顺序,然后通过asShortBuffer取出short数组。
摘要由CSDN通过智能技术生成

前言: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);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值