音视频流媒体硬解码是指不使用CPU进行编码,使用显卡GPU,专用的DSP、FPGA、ASIC芯片等硬件进行编码。编码框架Video ToolBox和AudioToolbox。
EasyRTMP是结合了多种音视频缓存及网络技术的一个rtmp直播推流端,包括:圆形缓冲区(circular buffer)、智能丢帧、自动重连、rtmp协议等等多种技术,能够非常有效地适应各种平台(Windows、Linux、ARM、Android、iOS),各种网络环境(有线、wifi、4G),以及各种情况下的直播恢复(服务器重启、网络重启、硬件设备重启)。
调用方法
EasyRTMP_File:EasyRTMP做为RTMP推送端,将本地文件推送到RTMP流媒体服务器;
EasyRTMP_RTSP:将RTSP/RTP数据获取到本地,再通过EasyRTMP推送到RTMP服务器;
EasyRTMP-Android:Android安卓RTMP直播推流,采集安卓手机前/后摄像头、麦克风音视频推送直播;项目地址:https://github.com/EasyDSS/EasyRTMP-Android
EasyRTMP-iOS:iOS苹果RTMP直播推流,采集苹果手机前/后摄像头、麦克风音视频推送直播;
EasyRTMP-iOS介绍下音频硬编码的简单流程。
AACEncoder.m文件实现了音频的硬编码功能。
iOS处理音频的库是AudioToolbox,音频硬编码的流程如下:
1、创建并配置AVCaptureSession
创建AVCaptureSession,然后找到音频的AVCaptureDevice,根据音频device创建输入并添加到session,最后添加output到session。
2、创建转换器
AudioStreamBasicDescription是输出流的结构体描述,配置好outAudioStreamBasicDescription后,根据AudioClassDescription(编码器),调用AudioConverterNewSpecific创建转换器。详情见方法:
- (void) setupEncoderFromSampleBuffer:(CMSampleBufferRef)sampleBuffer
3、获取到PCM数据并传入编码器
用CMSampleBufferGetDataBuffer获取到CMSampleBufferRef里面的CMBlockBufferRef,再通过CMBlockBufferGetDataPointer获取到_pcmBufferSize和_pcmBuffer;调用AudioConverterFillComplexBuffer传入数据,并在callBack函数调用填充buffer的方法。详情见方法:
- (void) encode:(CMSampleBufferRef)sampleBuffer
4、得到rawAAC码流,添加ADTS头。
AudioConverterFillComplexBuffer返回的是AAC原始码流,需要在AAC每帧添加ADTS头,调用adtsDataForPacketLength方法生成,最后把数据返回推流器。