运AudioToolbox播放AAC使用AudioToolbox播放AAC

2、音视频同步

demo中有个别个变量self.mAudioTimeStampself.mVideoTimeStamp,分别表示音频播放以及视频播放的流年穿。
内部音频播放进度由Audio
Unit驱动,视频播放进度由CADisplayLink驱动,为了保证视频进度不越音频进度,添加了if (self.mVideoTimeStamp < self.mAudioTimeStamp)的判断。
然而在模拟器运行的时节,视频的剖析比音频解析的快有点森,造成比较明显的非同台。
在真机运行的时,这种状况发生肯定的精益求精。
时还尚无找到较好之一道方式,如果来明要指教。

参考

Playing a sound file using the Default Output Audio
Unit
Supported Audio File and Data Formats in OS
X

2、音频播放

板播放效果因此之是Audio Unit,其中的RemoteIO
Unit只能接受PCM数据,故而要求读取出来的音频信息要是PCM格式的,并且安装于Audio
Unit的格式需要与outputSettings一致。

总结

AudioUnit和AudioConvert的API虽然简易,却是功能强大。
章中之牵线更多是投机当上过程遭到之片取,对于知识点的介绍很多凡是不够健全与周密的,对这个建议看参照目录
Extended Audio File ServicesAudio File Services
Audio Converter Services
的组成,提供联合的接口进行拍卖,下篇可能会见是Extended Audio File相关。

1、资源加载

资源加载用之是AVFoundation供的办法,先加载音视频的守则信息。
下一场初始化好音视频的格式信息outputSettingsoutputSettingsAVAssetReaderTrackOutput初始化的必要条件之一。

顾音轨和声道的分别,比如说在ktv唱歌的时段,通常伴奏是一个音轨,录到的人声是一个音轨,最后播放的时节进行夹。而声道我们经常因此声道数的定义,指的是响播放时之组合音响数量。
音轨=AudioTrack
声道=AudioChannel

前言

系文章:
使用VideoToolbox硬编码H.264
使用VideoToolbox硬解码H.264
使用AudioToolbox编码AAC
使用AudioToolbox播放AAC
HLS点播实现(H.264和AAC码流)
HLS推流的贯彻(iOS和OS
X系统)
iOS在线音频流播放
Audio Unit播放PCM文件
Audio
Unit录音(播放伴奏+耳返)
面前两篇介绍了Audio
Unit播放PCM文件边录边播,这次引入AudioConvert兑现aac/m4a/mp3格式的广播。

遇的题目

4、AudioConverterFillComplexBuffer返回561015652

通过OSStatus,查到561015652是kAudioConverterErr_RequiresPacketDescriptionsError = '!pkd',意思是无回调AudioStreamPacketDescriptions参数;
于音频格式mBytesPerPacket=0的数据,需要AudioStreamPacketDescriptions参数来增援转换音频数据;
缓解方案就是是新建AudioStreamPacketDescriptions屡组,并且在读取后赋值给outDataPacketDescription(见demo);

正文

3、具体细节

1、初始化AudioFile,通过AudioFileOpenURL开辟音频文件,并读取对应之音频格式(AudioStreamBasicDescription);这里和Audio
Unit播放PCM文件不等的凡,还欲读取kAudioFilePropertyMaximumPacketSizekAudioFilePropertyAudioDataPacketCount少数单特性,分别是单个package的极其特别size和packet的多寡,并经缓存的大大小小以及package的size创建AudioStreamPacketDescription的数组;
2、初始化AudioUnit,设置AVAudioSession的Category为AVAudioSessionCategoryPlayback;初始化AudioBufferList,设置AudioUnit的playback回调;
3、在AudioUnit的playback回调中,调用AudioConvert的AudioConverterFillComplexBuffer函数并设置好回调方法lyInInputDataProc;在回调的lyInInputDataProc中,通过AudioFileReadPacketData读取音频数据并拿读取的AudioStreamPacketDescription回传;
4、AudioConvert转换后底节拍数据会填入参数buffList,将相应的多寡复制给AudioUnit的playback参数;

3、视频播放

视频播放其实就算是图像信息之绘图,从资源我们可以读取到图像信息,再把图像传给已经封装好之LYOpenGLView类,就得绘制图像。图像信息占内存较为强烈,需要专注内存的回收。

正文

1、确定Audio Unit音频格式

品味加载资源文件的音频格式并设置为Audio Unit,但为Audio
Unit无法接受资源文件的格式(大多数文本之音频文件格式为AAC)。
化解方案是一直装读取的音频格式信息吗PCM,并且手动初始化ASBD,保证一定量端的格式一致。
如下,是资源文件的点子读取格式和手动初始化的格式:

    NSMutableDictionary *outputSettings = [NSMutableDictionary dictionary];
    [outputSettings setObject:@(kAudioFormatLinearPCM) forKey:AVFormatIDKey];
    [outputSettings setObject:@(16) forKey:AVLinearPCMBitDepthKey];
    [outputSettings setObject:@(NO) forKey:AVLinearPCMIsBigEndianKey];
    [outputSettings setObject:@(NO) forKey:AVLinearPCMIsFloatKey];
    [outputSettings setObject:@(YES) forKey:AVLinearPCMIsNonInterleaved];
    [outputSettings setObject:@(44100.0) forKey:AVSampleRateKey];
    [outputSettings setObject:@(1) forKey:AVNumberOfChannelsKey];

    AudioStreamBasicDescription inputFormat;
    inputFormat.mSampleRate = 44100;
    inputFormat.mFormatID = kAudioFormatLinearPCM;
    inputFormat.mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsNonInterleaved;
    inputFormat.mFramesPerPacket = 1;
    inputFormat.mChannelsPerFrame = 1;
    inputFormat.mBytesPerPacket = 2;
    inputFormat.mBytesPerFrame = 2;
    inputFormat.mBitsPerChannel = 16;
    self.fileFormat = inputFormat;

1、格式转换

节奏数据的格式转换包括采样率改变,单声道到大半声道的转移、音调的升降低等,audio
unit有一个专门格式转换unit(kAudioUnitType_FormatConverter,type of 'aufc')。
AudioUnit不支持vbr的数据,也非支持由一个有损压缩格式转换为pcm或者pcm转换为出损格式,对于生损格式的节拍数据易,需要因此CoreAudio的Audio
Converter API。

切切实实分析

1、API替换

平等开始用底凡AudioFileReadPackets术读取音频数据,后面在撞题目后发现AudioFileReadPackets让调换成AudioFileReadPacketData,参数近似;

前言

系文章:
使用VideoToolbox硬编码H.264
使用VideoToolbox硬解码H.264
使用AudioToolbox编码AAC
使用AudioToolbox播放AAC
HLS点播实现(H.264和AAC码流)
HLS推流的兑现(iOS和OS
X系统)
iOS在线音频流播放
Audio Unit播放PCM文件
Audio
Unit录音(播放伴奏+耳返)
Audio
Unit播放aac/m4a/mp3等文件
Audio
Unit和ExtendedAudioFile播放音频
AUGraph结合RemoteI/O Unit与Mixer
Unit

地方的章介绍了音视频信息的加载与分析,在另外的《OpenGLES文集》也详细介绍了OpenGL如何绘制图像。
这次结合Audio Unit和OpenGL
ES,分别加载多媒体文件的音频和视频信息并播放。

下是召开下后的效用图:

Audio Unit & OpenGL ES.gif

2、AudioConverter的转换函数的返回值

调用AudioConverterFillComplexBuffer继,在回调方法lyInInputDataProc受,如果安
*ioNumberDataPackets = 0,并且返回 noErr, AudioConverter 会进入
Finished 的状态;

回到非零的价值,表示数据不就,比如当demo中回到了NO_MORE_DATANO_MORE_DATA是由定义的非零返回值;

总结

本文没有扩大更多的音频和视频知识,通过结合三独片文化,组成核心的音视频播放流程。
是因为时间原因,所召开的技术预研无法好好,代码没有特别好的打磨。
demo更多是实践某些想法,如果代码是问题,恳请指出,帮助你自己他丢掉踩一些坑。

2、AudioFile API 和 Converter

AudioFile API提供了API对音频文件的创建、打开、修改及保存;
Audio Converters 用于音频文件的编解码,还可以用于sample
rate的改、int到float的变,最普遍是用音频文件转成pcm播放;
脚Converter的鲜个格式:

Source Format
Sample Rate:              44100
Format ID:                 .mp3
Format Flags:                 0
Bytes per Packet:             0
Frames per Packet:         1152
Bytes per Frame:              0
Channels per Frame:           2
Bits per Channel:             0

Target Format
Sample Rate:              44100
Format ID:                 lpcm
Format Flags:                 4
Bytes per Packet:             2
Frames per Packet:            1
Bytes per Frame:              2
Channels per Frame:           1
Bits per Channel:            16

整思路

demo包括三要命有,分别是资源加载旋律播放视频播放

  • 资源加载:是为此AVURLAsset加载资源文件,再创资源读取器AVAssetReader,然后附加音频读取接口mReaderAudioTrackOutput同视频读取接口mReaderVideoTrackOutput顶资源读取器。
  • 音频播放
    :从音频读取接口mReaderAudioTrackOutput加载音频信息得到CMSampleBuffer,用方法CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer将拍子数据变动成AudioBufferList格式,再采用AudioUnit播放;
  • 视频播放:从视频读取接口mReaderVideoTrackOutput加载视频信息得到CMSampleBuffer,用方法CMSampleBufferGetImageBuffer把视频数据变动成为CVPixelBufferRef格式,再就此OpenGL
    ES绘制图像;

    整体流程图

撞的题材

3、AudioConverterNewSpecific返回-50

通过OSStatus,可以看出-50是AVAudioSessionErrorCodeBadParam
参数不等同;
反省代码,发现是以采取AudioConverterNewSpecific()
创建转换器的时候输入流格式与输出流格式的声道数设置不同;(解决方案就是声道数改成为一致)

相关文章