音視頻流媒體硬解碼是指不使用CPU進行編碼,使用顯卡GPU,專用的DSP、FPGA、ASIC芯片等硬件進行編碼。編碼框架Video ToolBox和AudioToolbox。git
EasyRTMP是結合了多種音視頻緩存及網絡技術的一個rtmp直播推流端,包括:圓形緩衝區(circular buffer)、智能丟幀、自動重連、rtmp協議等等多種技術,可以很是有效地適應各類平臺(Windows、Linux、ARM、Android、iOS),各類網絡環境(有線、wifi、4G),以及各類狀況下的直播恢復(服務器重啓、網絡重啓、硬件設備重啓)。github
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直播推流,採集蘋果手機前/後攝像頭、麥克風音視頻推送直播;項目地址session
EasyRTMP-iOS介紹下音頻硬編碼的簡單流程。app
AACEncoder.m文件實現了音頻的硬編碼功能。ide
iOS處理音頻的庫是AudioToolbox,音頻硬編碼的流程以下:
一、建立並配置AVCaptureSession
建立AVCaptureSession,而後找到音頻的AVCaptureDevice,根據音頻device建立輸入並添加到session,最後添加output到session。
二、建立轉換器
AudioStreamBasicDescription是輸出流的結構體描述,配置好outAudioStreamBasicDescription後,根據AudioClassDescription(編碼器),調用AudioConverterNewSpecific建立轉換器。詳情見方法:
三、獲取到PCM數據並傳入編碼器
用CMSampleBufferGetDataBuffer獲取到CMSampleBufferRef裏面的CMBlockBufferRef,再經過CMBlockBufferGetDataPointer獲取到_pcmBufferSize和_pcmBuffer;調用AudioConverterFillComplexBuffer傳入數據,並在callBack函數調用填充buffer的方法。詳情見方法:
四、獲得rawAAC碼流,添加ADTS頭。
AudioConverterFillComplexBuffer返回的是AAC原始碼流,須要在AAC每幀添加ADTS頭,調用adtsDataForPacketLength方法生成,最後把數據返回推流器。