視訊硬編碼
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
複製程式碼