2

アプリケーションを独自のコーデックから iOS ネイティブ h264 エンコーダー (VideoToolbox.framework) に移行する作業を行っていますが、質問があります。

圧縮データのビットレートまたはデータレートを設定する方法はありますか?

エンコーダーセッションを作成する方法は次のとおりです。

CFMutableDictionaryRef sessionAttributes = CFDictionaryCreateMutable(
                                                                     NULL, 
                                                                     0,    
                                                                     &kCFTypeDictionaryKeyCallBacks,
                                                                     &kCFTypeDictionaryValueCallBacks);

//** bitrate
int fixedBitrate = bitrate; // 2000 * 1024 -> assume 2 Mbits/s

CFNumberRef bitrateNum = CFNumberCreate(NULL, kCFNumberSInt32Type, &fixedBitrate);
CFDictionarySetValue(sessionAttributes, kVTCompressionPropertyKey_AverageBitRate, bitrateNum);
CFRelease(bitrateNum);

CFDictionarySetValue(sessionAttributes, kVTCompressionPropertyKey_ProfileLevel, kVTProfileLevel_H264_High_AutoLevel);

CFDictionarySetValue(sessionAttributes, kVTCompressionPropertyKey_RealTime, kCFBooleanTrue);

OSStatus error = VTCompressionSessionCreate(kCFAllocatorDefault,
                                            width,
                                            height,
                                            kCMVideoCodecType_H264,
                                            sessionAttributes, 
                                            NULL, 
                                            kCFAllocatorDefault,  
                                            &EncoderCallback,
                                            this, *outputCallbackRefCon,
                                            &m_EncoderSession);

私はさまざまな値でたくさん遊んでいますがkVTCompressionPropertyKey_AverageBitRate、これは私には何の役にも立ち kVTCompressionPropertyKey_DataRateLimitsません。また、さまざまな値で試してみましたが、運もありませんでした。

アイデア、提案は大歓迎です

4

1 に答える 1

9

VTSessionSetProperty短い話は、セッションを作成した後に使用する必要があるということです。

5 番目のパラメーターとして渡す辞書は、実際には、エンコーダーの設定ではなく、使用するエンコーダーを指定するために使用されます。少しわかりにくいですが、Apple のドキュメントには次のように記載されています。

圧縮セッションを作成するときに特定のビデオ エンコーダーを指定するには、このキーと EncoderID を値として含むエンコーダー仕様 CFDictionary を渡します。EncoderID CFString は、VTCopyVideoEncoderList によって返される配列内の kVTVideoEncoderList_EncoderID エントリから取得できます。

関数を使用してセッションを作成した後、 プロパティkVTCompressionPropertyKey_AverageBitRateとプロパティを設定する必要があります。kVTCompressionPropertyKey_DataRateLimitsVTSessionSetProperty

例えば:

 status = VTSessionSetProperty(session, kVTCompressionPropertyKey_AverageBitRate, (__bridge CFTypeRef)@(600 * 1024));
 status = VTSessionSetProperty(session, kVTCompressionPropertyKey_DataRateLimits, (__bridge CFArrayRef)@[800 * 1024 / 8, 1]);

kVTCompressionPropertyKey_AverageBitRateそれにはビット kVTCompressionPropertyKey_DataRateLimitsが必要であり、バイトと秒が必要であることを覚えておいてください。

于 2015-07-19T15:15:24.123 に答える