視訊硬編碼(iOS端)

Gentear發表於2018-03-26

視訊硬編碼

硬編碼流程圖

VideoToolBox(硬編碼部分)

VideoToolBox是一個直接通過硬體來提升視訊編碼和解碼能力的框架。也就是我們俗稱的硬解碼和硬編碼

VTCompressionSession (object)

一個管理視訊資料壓縮的會話

VTCompressionSessionCreate (method)

建立VTCompressionSession

//OSStatus 返回建立的狀態
OSStatus VTCompressionSessionCreate(
//1. 一個分配器 預設為Null
CFAllocatorRef allocator, 
//2. 視訊幀的畫素寬度
int32_t width, 
//3. 視訊幀的畫素高度
int32_t height, 
//4. 編碼型別 常用H264編碼 kCMVideoCodecType_H264
CMVideoCodecType codecType, 
//5. 編碼方式Null由videoToolBox選擇
CFDictionaryRef encoderSpecification, 
//6. 建立一個畫素緩衝池的屬性 Null為由videoToolBox建立
CFDictionaryRef sourceImageBufferAttributes, 
//7. 資料壓縮分配器  預設為Null
CFAllocatorRef compressedDataAllocator, 
//8. 輸出回撥   VTCompressionSessionEncodeFrame
VTCompressionOutputCallback outputCallback, 
//9. 回撥物件 
void *outputCallbackRefCon,
//10. VTCompressionSession 要建立的物件 
VTCompressionSessionRef  _Nullable *compressionSessionOut);
複製程式碼

VTSessionSetProperty && VTSessionSetProperties (method)

設定 VideoToolbox session 屬性

//返回狀態
OSStatus VTSessionSetProperty(
//VTCompressionSession 設定的session物件
VTSessionRef session, 
//key值
CFStringRef propertyKey, 
//value值
CFTypeRef propertyValue);
複製程式碼

批量設定 VideoToolbox session 屬性


//返回狀態
OSStatus VTSessionSetProperties(
//VTCompressionSession 設定的session物件
VTSessionRef session, 
//CFDictionaryRef 字典儲存
CFDictionaryRef propertyDictionary);

複製程式碼

VTCompressionSessionPrepareToEncodeFrames (method)

允許編碼器編碼開始之前執行任何必要的資源分配框架(可選)。該方法需要在VTCompressionSessionEncodeFrame之前呼叫

OSStatus VTCompressionSessionPrepareToEncodeFrames(VTCompressionSessionRef session);
複製程式碼

VTCompressionSessionEncodeFrame (method)

把會話中的每一幀進行壓縮

OSStatus VTCompressionSessionEncodeFrame(
//資料壓縮會話
VTCompressionSessionRef session, 
//一個核心的視訊影象緩衝區包含一個視訊幀
CVImageBufferRef imageBuffer, 
//幀的時間戳,時間戳後一個必須大於前一個
CMTime presentationTimeStamp, 
//這一幀展示的時間 預設kCMTimeInvalid
CMTime duration, 
//每一幀的屬性
CFDictionaryRef frameProperties, 
//一個回撥,可以對每一幀進行處理 不需要處理傳Null
void *sourceFrameRefCon, 
//VTEncodeInfoFlags 設定同步非同步處理 0為非同步
VTEncodeInfoFlags *infoFlagsOut);
複製程式碼

VTCompressionSessionInvalidate (method)

廢棄VTCompressionSession

//廢棄值
void VTCompressionSessionInvalidate(VTCompressionSessionRef session);
//完成後需要進行release
void CFRelease(CFTypeRef cf);
//最後將物件置空Null
session = Null
複製程式碼

程式碼參考簡書作者:落影loyinglin

相關文章