项目都是我的的调研与实验,可能不少很差或者不对的地方请多包涵。shell
1 功能概况xcode
* 实现音视频的数据的采集服务器
* 实现音视频数据的编码,视频编码成h264,音频编码成aac框架
* 实现音视频数据的发布,将编码好的音视频数据传输到服务器函数
2 视频和音频编码方案编码
视频硬编码须要使用AVAssetWriter,可是他只支持直接将数据编码成h264并写入文件,不提供接口中途获取视频数据处理,咱们须要在保存的文件中读出数据code
据顶采用软编码,主流开源编解码器Xvid,x264,ffmpeg,Xvid是基于MPEG4协议的编解码器,x264是基于H.264协议的编码器,ffmpeg集合了各类音频,视频编解码协议,经过设置参数能够完成基于MPEG4,H.264等协议的编解码,基于效率,决定使用x264进行软编视频
Ios支持aac音频软编码和硬编码,硬编无需消耗cpu,效率高,决定使用硬编。使用Audio Queueblog
3. 技术流程图接口
4 相关技术
(1)x264编码器
x264是一个采用GPL受权的视频编码自由软件[1]。x264的主要功能在于进行H.264/MPEG-4 AVC的视频编码,而不是做为解码器(decoder)之用。
(2) 在xcode下编译x264库
* 下载x264的库
* 打开shell,执行编译,因为咱们的饮食频道额采集在模拟器上不能进行,因此不编译i386的库,直接编译armv7的库
* 执行make,编译成功获得libx264.a
(3) Audioqueue简介
要在iOS设备上播放和录制音频,苹果推荐咱们使用AVFoundation框架中的AVAudioPlayer和AVAudioRecorder类。虽然用法比较简单,可是不支持流式;这就意味着:在播放音频前,必须等到整个音频加载完成后,才能开始播放音频;录音时,也必须等到录音结束后,才能获取到录音数据。这给应用形成了很大的局限性。为了解决这个问题,咱们就须要使用Audio Queue Services来播放和录制音频.
Audio Queue Services提供了在iOS 和 Mac OS X上直接录制和播放各类格式的音频,他能让你的应用程序在没有硬件接口知识的状况下使用硬件录音和播放设备,如microphones 和loudspeakers。
(4) Audioqueue录制音频过程
一个Recording Audio Queue,包括Buffer(缓冲器)组成的Buffer Queue(缓冲队列),以及一个Callback(回调)
录音流程以下:
l 将音频填入第一个缓冲器中
l 当队列中的第一个缓冲器填满时,会自动填充下一个缓冲器。此时,会触发回调。
l 在回调函数中须要将音频数据流写入磁盘
l 而后,须要在回调函数中将该缓冲器从新放入缓冲队列,以便重复使用该缓冲器。重复步骤2。
Audio Queue录制aac音频数据以下流程:
5 rtmp发送音视频
xcode中编译librtmp库
在xcode中使用librtmp库可将音视频数据打成包,遵循rtmp协议,将数据发送到指定服务器,前提须要编译librtmp库并在xcode中使用此库
* 下载rtmpdump源码
* shell下编译librtmp成librtmp.a并加入到xcode工程
* 拷贝rtmpdump的include文件夹到xcode下的相应工程,并将路径添加到User Header SearchPaths
* 在工程中引入使用librtmp
6. 音视频同步
采用时间戳技术,时间戳即为一帧的采集时间,音视频采起同一个参考时间,给每一个帧打上时间戳
待续。。。