ios自带pr杜比音频解码限制解码是官方授权吗

大家觉得杜比全景声和IMAX的音效哪个更好? - 知乎35被浏览72042分享邀请回答133 条评论分享收藏感谢收起与世界分享知识、经验和见解关于nplayer和nplayer plus版本的测试!
昨天花30元买了nplayer,然后今天在马云家3毛买了共享账号买了60元的nplayer plus!
30元的应该是调用iOS的杜比解码,而nplayer plus是自带授权杜比解码和音效!
两个播放器共同播放杜比音频的金刚狼3,
Nplayer只显示开dts,nplayer plus只显示开杜比音效!
经过我反复对比,发现开dts声音较尖锐,开杜比则是低音比较出色!
问题是如果nplayer不开dts,如何知道调用iOS的杜比解码呢?如果不开dts,那是否自动开杜比音效呢?
同时,nplayer plus的杜比也可以关闭!
image8251.png (211.49 KB, 下载次数: 0)
4&分钟前 上传
image1465.png (162.02 KB, 下载次数: 0)
4&分钟前 上传
image1034.png (138.05 KB, 下载次数: 0)
4&分钟前 上传
我真是闲的蛋疼!!
如图,显示杜比的是nplayer plus,
显示dts的是nplayer!
有没有其他人可以交流下使用感受?
iPhone7 7Plus【0.26mm
美版iphone7激活不了,求救!
现在国外电影中都用的苹果!为苹果打广告么
昨天在jd买了个7plus
今天去深圳,特地测试了下网速,大家猜下哪
7plus 刷机变成了你的iphone有
Airpods上市在即,各位会买吗?
急急急!有人在外地登录我的appleID
来吐槽下今年的7p盒子....没激活就摔
黑科技!知道真相的我眼泪流下来。。。
UAG 和官方皮套哪个好?
实力水一波,温馨提示,powerbeat
双11免单/半价/买2付1整理
iTunes如何将无损格式音乐导入iPh
对小7这个电量很满意了!
现在售后是换还是修?
想买亮黑的封釉请看!
小白求教!
请问 冰淇淋套餐
之前说EMS慢,我是不信的,直到…………
贴全覆盖膜能用官网皮套吗?
7P现在啥价格
合租 超低价
天津的,有能预约到磨砂黑7P 32G的吗
iPhone7开箱---威锋首台银白7p
smart battery case真心
终于抢到香港沙田新城市广场玫瑰金plus
黑色掉价了,有图有真相,大学家知道原因吗
我就想知道9月17号下单的大7黑色128
9元钱买的壳子堪比原装手感(版主大哥,此
【直播预告】WWDC 2017进入倒计时
本帖最后由lydia_emyeu于201...
【直播回顾】2016苹果秋季新品发布会威
本帖最后由lydia_emyeu于201...
重庆北城天街 7P 128 亮黑 有库存
无意中发现。。大家有需求的就去吧。。...
iPhone7镜头究竟是不是采用蓝宝石,
一开始作者检测拿iPhone镜头跟天梭表...
邮政的,交货时间要14号,真是日了...
大黑到手完了,电流声 阴阳暖屏 全有了
8号发货9...
7p的电池真的很耐用
是的是的...
发货了, 终于发货了
9月11日的订单,6号变态,刚才终于发货...
每年都抢不到首发的人终于捡到了
晚上进官网想看看火爆程度,7plus的都...
Apple store预约的问题~~~
假如今天在香港官网上预约,必须是预约今天...
哪个版本好...
image8443.png(102.26KB,下载...
昨天花30元买了nplayer,然后今天在马云家3毛买了共享账号买了60元的np...
刷机不自己进去恢复模式刷机刷不过去有没有高人知道什么原因...
其实生活从来不缺少美好,只是缺少发现美的眼睛!感觉自从iPhone6以后,iPh...
电量掉得太快了,求鉴定,谢谢image967.pn...
/x/page/y0506naado8.html...
如题,老司机求带路,签收需要注意什么?收了再说开箱记得录像就行明天到货,收货需要...
刷机不自己进去恢复模式刷机刷不过去有没有高人知道什么原因...
自己看吧!boss源下载image8768.jpg...
还没激活,屎黄屎黄的,百度说可以调?需要退了么,还没激活image1497...
2017款mne02ch比了2015款mk452有和提升,CPU显卡等。...
用助手刷也错误itunes刷也错误,换了几根数据线,换了几个USB接口,电脑也换...
点此链接更改/mobile/!mo.....
测试版系统用到现在第一遇到手机死机,无法硬启动,一直卡着,接电话可以,其他滑动屏...
昨天正在路边等人,来一个大哥问我要手机不,苹果7P黑色128G嘎嘎新只要2500...
越来越看不清楚苹果的套路了。有可能关闭验证,因为也有一段时间了。...
fanqiang好工具wingy限免了image1...
image6990.png(104.86KB,下载...AAC(Advanced Audio Coding),中文名:高级音频编码,出现于1997年,基于MPEG-2的音频编码技术。由Fraunhofer
IIS、杜比实验室、AT&T、Sony等公司共同开发,目的是取代MP3格式。2000年,MPEG-4标准出现后,AAC重新集成了其特性,加入了SBR技术和PS技术,为了区别于传统的MPEG-2
AAC又称为MPEG-4 AAC。
iOS平台支持AAC编码器,主要使用AudioToolbox中的AudioConverter API。之所以做AAC编码器是因为在做一个HLS的功能,HLS要求的TS文件,需要视频采用H264编码,音频采用AAC编码。H264可以使用硬件或软件编码器,前面已经介绍。AAC也可以使用硬件或者软件编码,iOS全都支持。
首先需要创建一个Converter,也就是一个AAC Encoder,使用如下接口:
extern OSStatus
AudioConverterNew(
const AudioStreamBasicDescription*
inSourceFormat,
const AudioStreamBasicDescription*
inDestinationFormat,
AudioConverterRef*
outAudioConverter)
__OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0);
输入参数分别是源和目的的数据格式。
在AAC编码的场景下,源格式就是采集到的PCM数据,目的格式就是AAC。
AudioStreamBasicDescription inAudioStreamBasicD
FillOutASBDForLPCM()
inAudioStreamBasicDescription.mFormatID = kAudioFormatLinearPCM;
inAudioStreamBasicDescription.mSampleRate = 44100;
inAudioStreamBasicDescription.mBitsPerChannel = 16;
inAudioStreamBasicDescription.mFramesPerPacket = 1;
inAudioStreamBasicDescription.mBytesPerFrame = 2;
inAudioStreamBasicDescription.mBytesPerPacket = inAudioStreamBasicDescription.mBytesPerFrame * inAudioStreamBasicDescription.mFramesPerP
inAudioStreamBasicDescription.mChannelsPerFrame = 1;
inAudioStreamBasicDescription.mFormatFlags = kLinearPCMFormatFlagIsPacked | kLinearPCMFormatFlagIsSignedInteger | kLinearPCMFormatFlagIsNonI
inAudioStreamBasicDescription.mReserved = 0;
AudioStreamBasicDescription outAudioStreamBasicDescription = {0}; // Always initialize the fields of a new audio stream basic description structure to zero, as shown here: ...
outAudioStreamBasicDescription.mChannelsPerFrame = 1;
outAudioStreamBasicDescription.mFormatID = kAudioFormatMPEG4AAC;
UInt32 size = sizeof(outAudioStreamBasicDescription);
AudioFormatGetProperty(kAudioFormatProperty_FormatInfo, 0, NULL, &size, &outAudioStreamBasicDescription);
OSStatus status = AudioConverterNew(&inAudioStreamBasicDescription, &outAudioStreamBasicDescription, &_audioConverter);
if(status != 0) {NSLog(@&setup converter failed: %d&, (int)status);}
这样就创建了AAC编码器,默认情况下,Apple会创建一个硬件编码器,如果硬件不可用,会创建软件编码器。
经过我的测试,硬件AAC编码器的编码时延很高,需要buffer大约2秒的数据才会开始编码。而软件编码器的编码时延就是正常的,只要喂给1024个样点,就会开始编码。
那么如何在创建的时候指定使用软件编码器呢?需要用到下面的接口:
- (AudioClassDescription *)getAudioClassDescriptionWithType:(UInt32)type
fromManufacturer:(UInt32)manufacturer
static AudioClassD
UInt32 encoderSpecifier =
st = AudioFormatGetPropertyInfo(kAudioFormatProperty_Encoders,
sizeof(encoderSpecifier),
&encoderSpecifier,
NSLog(@&error getting audio format propery info: %d&, (int)(st));
unsigned int count = size / sizeof(AudioClassDescription);
AudioClassDescription descriptions[count];
st = AudioFormatGetProperty(kAudioFormatProperty_Encoders,
sizeof(encoderSpecifier),
&encoderSpecifier,
descriptions);
NSLog(@&error getting audio format propery: %d&, (int)(st));
for (unsigned int i = 0; i & i++) {
if ((type == descriptions[i].mSubType) &&
(manufacturer == descriptions[i].mManufacturer)) {
memcpy(&desc, &(descriptions[i]), sizeof(desc));
AudioClassDescription *desc = [self getAudioClassDescriptionWithType:kAudioFormatMPEG4AAC
fromManufacturer:kAppleSoftwareAudioCodecManufacturer];
OSStatus status = AudioConverterNewSpecific(&inAudioStreamBasicDescription, &outAudioStreamBasicDescription, 1, desc, &_audioConverter);
如果要正确的编码,编码码率参数是必须设置的。否则编码时会返回错误码(!dat)。
UInt32 ulBitRate = 64000;
UInt32 ulSize = sizeof(ulBitRate);
status = AudioConverterSetProperty(_audioConverter, kAudioConverterEncodeBitRate, ulSize, &ulBitRate);
需要注意,AAC并不是随便的码率都可以支持。比如如果PCM采样率是44100KHz,那么码率可以设置64000bps,如果是16K,可以设置为32000bps。
创建完成Converter和设置完Bitrate之后,可以查询一下最大编码输出的大小,后续会用到。
UInt32 value = 0;
size = sizeof(value);
AudioConverterGetProperty(_audioConverter, kAudioConverterPropertyMaximumOutputPacketSize, &size, &value);
获取出来的Value表示编码器最大输出的包大小。
然后调用AudioConverterFillCOmplexBuffer进行编码:
AudioBufferList outAudioBufferList = {0};
outAudioBufferList.mNumberBuffers = 1;
outAudioBufferList.mBuffers[0].mNumberChannels = 1;
outAudioBufferList.mBuffers[0].mDataByteSize =//value是上面查询到的值
outAudioBufferList.mBuffers[0].mData = new int8[value];
UInt32 ioOutputDataPacketSize = 1;
status = AudioConverterFillComplexBuffer(_audioConverter, inInputDataProc, (__bridge void *)(self), &ioOutputDataPacketSize, &outAudioBufferList, NULL);
编码接口中,inInputDataProc是一个输入数据的回调函数。用来喂PCM数据给Converter,ioOutputDataPacketSize为1表示编码产生1帧数据即返回。outAudioBufferList用来存放编码后的数据。
inInputDataProc中的处理如下:
static OSStatus inInputDataProc(AudioConverterRef inAudioConverter, UInt32 *ioNumberDataPackets, AudioBufferList *ioData, AudioStreamPacketDescription **outDataPacketDescription, void *inUserData)
AACEncoder *encoder = (__bridge AACEncoder *)(inUserData);
UInt32 requestedPackets = *ioNumberDataP
uint32_t bufferLength = requestedPackets * 2;
uint32_t bufferR
bufferRead = [encoder.pcmPool readBuffer:&buffer withLength:bufferLength];
if (bufferRead == 0) {
*ioNumberDataPackets = 0;
return -1;
ioData-&mBuffers[0].mData =
ioData-&mBuffers[0].mDataByteSize = bufferR
ioData-&mNumberBuffers = 1;
ioData-&mBuffers[0].mNumberChannels = 1;
*ioNumberDataPackets = bufferRead && 1;
return noE
pcmPool是一个用于存放PCM数据的环形缓冲区。
因为采集输入每次不一定有1024样点,所以可以将数据缓存起来,再满足1024样点时再调用编码。
另外,对于TS文件来说,每个AAC数据需要增加一个adts头,adts头是一个7bit的数据,通过adts可以得知AAC数据的编码参数,方便解码器进行解码。
adts头的计算方法如下:
- (NSData*) adtsDataForPacketLength:(NSUInteger)packetLength {
int adtsLength = 7;
char *packet = (char *)malloc(sizeof(char) * adtsLength);
// Variables Recycled by addADTStoPacket
int profile = 2;
//39=MediaCodecInfo.CodecProfileLevel.AACObjectELD;
int freqIdx = 8;
int chanCfg = 1;
//MPEG-4 Audio Channel Configuration. 1 Channel front-center
NSUInteger fullLength = adtsLength + packetL
// fill in ADTS data
packet[0] = (char)0xFF; //
= syncword
packet[1] = (char)0xF9; //
= syncword MPEG-2 Layer CRC
packet[2] = (char)(((profile-1)&&6) + (freqIdx&&2) +(chanCfg&&2));
packet[3] = (char)(((chanCfg&3)&&6) + (fullLength&&11));
packet[4] = (char)((fullLength&0x7FF) && 3);
packet[5] = (char)(((fullLength&7)&&5) + 0x1F);
packet[6] = (char)0xFC;
NSData *data = [NSData dataWithBytesNoCopy:packet length:adtsLength freeWhenDone:YES];
adts头的计算需要几个参数:profile/frequency/channels/length,具体可参考http://wiki.multimedia.cx/index.php?title=ADTS
参考文献:
Audio Converter Services Reference
注明:本文章属于转载,仅供行业人员学习交流使用,文章版权属于原创作者,在此向原创者致敬,感谢原创作者为大家学习交流提供精品内容。
站方声明:IThao123是为广大互联网从业者免费提供学习交流的平台,如果侵犯了原创著作权,请联系站方删除,给你带来不便,深表歉意。使用iOS自带AAC编码器
时间: 19:03:11
&&&& 阅读:7645
&&&& 评论:
&&&& 收藏:1
标签:&&&&&&&&&&&&&&&AAC(Advanced Audio Coding),中文名:高级,出现于1997年,基于的音频编码技术。由Fraunhofer
IIS、、、等公司共同开发,目的是取代格式。2000年,标准出现后,AAC重新集成了其特性,加入了SBR技术和PS技术,为了区别于传统的MPEG-2
AAC又称为MPEG-4 AAC。
iOS平台支持AAC编码器,主要使用AudioToolbox中的AudioConverter API。之所以做AAC编码器是因为在做一个HLS的功能,HLS要求的TS文件,需要视频采用H264编码,音频采用AAC编码。H264可以使用硬件或软件编码器,前面已经介绍。AAC也可以使用硬件或者软件编码,iOS全都支持。
首先需要创建一个Converter,也就是一个AAC Encoder,使用如下接口:
extern OSStatus
AudioConverterNew(
const AudioStreamBasicDescription*
inSourceFormat,
const AudioStreamBasicDescription*
inDestinationFormat,
AudioConverterRef*
outAudioConverter)
__OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_2_0);
输入参数分别是源和目的的数据格式。
在AAC编码的场景下,源格式就是采集到的PCM数据,目的格式就是AAC。
AudioStreamBasicDescription inAudioStreamBasicD
FillOutASBDForLPCM()
inAudioStreamBasicDescription.mFormatID = kAudioFormatLinearPCM;
inAudioStreamBasicDescription.mSampleRate = 44100;
inAudioStreamBasicDescription.mBitsPerChannel = 16;
inAudioStreamBasicDescription.mFramesPerPacket = 1;
inAudioStreamBasicDescription.mBytesPerFrame = 2;
inAudioStreamBasicDescription.mBytesPerPacket = inAudioStreamBasicDescription.mBytesPerFrame * inAudioStreamBasicDescription.mFramesPerP
inAudioStreamBasicDescription.mChannelsPerFrame = 1;
inAudioStreamBasicDescription.mFormatFlags = kLinearPCMFormatFlagIsPacked | kLinearPCMFormatFlagIsSignedInteger | kLinearPCMFormatFlagIsNonI
inAudioStreamBasicDescription.mReserved = 0;
AudioStreamBasicDescription outAudioStreamBasicDescription = {0}; // Always initialize the fields of a new audio stream basic description structure to zero, as shown here: ...
outAudioStreamBasicDescription.mChannelsPerFrame = 1;
outAudioStreamBasicDescription.mFormatID = kAudioFormatMPEG4AAC;
UInt32 size = sizeof(outAudioStreamBasicDescription);
AudioFormatGetProperty(kAudioFormatProperty_FormatInfo, 0, NULL, &size, &outAudioStreamBasicDescription);
OSStatus status = AudioConverterNew(&inAudioStreamBasicDescription, &outAudioStreamBasicDescription, &_audioConverter);
if(status != 0) {NSLog(@&setup converter failed: %d&, (int)status);}
这样就创建了AAC编码器,默认情况下,Apple会创建一个硬件编码器,如果硬件不可用,会创建软件编码器。
经过我的测试,硬件AAC编码器的编码时延很高,需要buffer大约2秒的数据才会开始编码。而软件编码器的编码时延就是正常的,只要喂给1024个样点,就会开始编码。
那么如何在创建的时候指定使用软件编码器呢?需要用到下面的接口:
- (AudioClassDescription *)getAudioClassDescriptionWithType:(UInt32)type
fromManufacturer:(UInt32)manufacturer
static AudioClassD
UInt32 encoderSpecifier =
st = AudioFormatGetPropertyInfo(kAudioFormatProperty_Encoders,
sizeof(encoderSpecifier),
&encoderSpecifier,
NSLog(@&error getting audio format propery info: %d&, (int)(st));
unsigned int count = size / sizeof(AudioClassDescription);
AudioClassDescription descriptions[count];
st = AudioFormatGetProperty(kAudioFormatProperty_Encoders,
sizeof(encoderSpecifier),
&encoderSpecifier,
descriptions);
NSLog(@&error getting audio format propery: %d&, (int)(st));
for (unsigned int i = 0; i & i++) {
if ((type == descriptions[i].mSubType) &&
(manufacturer == descriptions[i].mManufacturer)) {
memcpy(&desc, &(descriptions[i]), sizeof(desc));
AudioClassDescription *desc = [self getAudioClassDescriptionWithType:kAudioFormatMPEG4AAC
fromManufacturer:kAppleSoftwareAudioCodecManufacturer];
OSStatus status = AudioConverterNewSpecific(&inAudioStreamBasicDescription, &outAudioStreamBasicDescription, 1, desc, &_audioConverter);
如果要正确的编码,编码码率参数是必须设置的。否则编码时会返回错误码(!dat)。
UInt32 ulBitRate = 64000;
UInt32 ulSize = sizeof(ulBitRate);
status = AudioConverterSetProperty(_audioConverter, kAudioConverterEncodeBitRate, ulSize, &ulBitRate);
需要注意,AAC并不是随便的码率都可以支持。比如如果PCM采样率是44100KHz,那么码率可以设置64000bps,如果是16K,可以设置为32000bps。
创建完成Converter和设置完Bitrate之后,可以查询一下最大编码输出的大小,后续会用到。
UInt32 value = 0;
size = sizeof(value);
AudioConverterGetProperty(_audioConverter, kAudioConverterPropertyMaximumOutputPacketSize, &size, &value);
获取出来的Value表示编码器最大输出的包大小。
然后调用AudioConverterFillCOmplexBuffer进行编码:
AudioBufferList outAudioBufferList = {0};
outAudioBufferList.mNumberBuffers = 1;
outAudioBufferList.mBuffers[0].mNumberChannels = 1;
outAudioBufferList.mBuffers[0].mDataByteSize =//value是上面查询到的值
outAudioBufferList.mBuffers[0].mData = new int8[value];
UInt32 ioOutputDataPacketSize = 1;
status = AudioConverterFillComplexBuffer(_audioConverter, inInputDataProc, (__bridge void *)(self), &ioOutputDataPacketSize, &outAudioBufferList, NULL);
编码接口中,inInputDataProc是一个输入数据的回调函数。用来喂PCM数据给Converter,ioOutputDataPacketSize为1表示编码产生1帧数据即返回。outAudioBufferList用来存放编码后的数据。
inInputDataProc中的处理如下:
static OSStatus inInputDataProc(AudioConverterRef inAudioConverter, UInt32 *ioNumberDataPackets, AudioBufferList *ioData, AudioStreamPacketDescription **outDataPacketDescription, void *inUserData)
AACEncoder *encoder = (__bridge AACEncoder *)(inUserData);
UInt32 requestedPackets = *ioNumberDataP
uint32_t bufferLength = requestedPackets * 2;
uint32_t bufferR
bufferRead = [encoder.pcmPool readBuffer:&buffer withLength:bufferLength];
if (bufferRead == 0) {
*ioNumberDataPackets = 0;
return -1;
ioData-&mBuffers[0].mData =
ioData-&mBuffers[0].mDataByteSize = bufferR
ioData-&mNumberBuffers = 1;
ioData-&mBuffers[0].mNumberChannels = 1;
*ioNumberDataPackets = bufferRead && 1;
return noE
pcmPool是一个用于存放PCM数据的环形缓冲区。
因为采集输入每次不一定有1024样点,所以可以将数据缓存起来,再满足1024样点时再调用编码。
另外,对于TS文件来说,每个AAC数据需要增加一个adts头,adts头是一个7bit的数据,通过adts可以得知AAC数据的编码参数,方便解码器进行解码。
adts头的计算方法如下:
- (NSData*) adtsDataForPacketLength:(NSUInteger)packetLength {
int adtsLength = 7;
char *packet = (char *)malloc(sizeof(char) * adtsLength);
// Variables Recycled by addADTStoPacket
int profile = 2;
//39=MediaCodecInfo.CodecProfileLevel.AACObjectELD;
int freqIdx = 8;
int chanCfg = 1;
//MPEG-4 Audio Channel Configuration. 1 Channel front-center
NSUInteger fullLength = adtsLength + packetL
// fill in ADTS data
packet[0] = (char)0xFF; //
= syncword
packet[1] = (char)0xF9; //
= syncword MPEG-2 Layer CRC
packet[2] = (char)(((profile-1)&&6) + (freqIdx&&2) +(chanCfg&&2));
packet[3] = (char)(((chanCfg&3)&&6) + (fullLength&&11));
packet[4] = (char)((fullLength&0x7FF) && 3);
packet[5] = (char)(((fullLength&7)&&5) + 0x1F);
packet[6] = (char)0xFC;
NSData *data = [NSData dataWithBytesNoCopy:packet length:adtsLength freeWhenDone:YES];
adts头的计算需要几个参数:profile/frequency/channels/length,具体可参考
参考文献:
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:&&&&&&&&&&&&&&&
&&国之画&&&& &&&&chrome插件
版权所有 京ICP备号-2
迷上了代码!}

我要回帖

更多关于 杜比音频解码许可限制 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信