2015-07-16 3 views
2

Я работаю на перемещение нашего приложения с некоторым собственным кодека IOS родного кодером h264 (VideoToolbox.framework) и есть вопрос:Как установить битрейт для VTCompressionSession

Есть ли существует способ установить битрейт или DataRate для сжатого данные ?

Вот как я создание датчика сессии:

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 с разными значениями, но и без каких-либо удачи.

Любые идеи, предложения приветствуются

+0

У вас возникли вопросы? У меня такая же проблема. Я использую формат кодирования H264 VTCompressoinSession, и я обнаружил, что его качество очень плохо, когда я его воспроизвожу. –

+1

Да, все хорошо, принятый ответ помог мне. – sage444

+0

Да, я установил 'VTSessionSetProperty (session, kVTCompressionPropertyKey_DataRateLimits, (__bridge CFArrayRef) @ [800 * 1024/8, 1]);', и он работает хорошо. –

ответ

7

Короткий рассказ является то, что вам нужно использовать VTSessionSetProperty после создания сеанса.

Словарь, который вы передаете как пятый параметр, фактически используется для указания кодировщика, а не настроек кодировщика. Это немного странно, но компания Apple документации говорится:

Чтобы указать конкретный видеокодер при создании сеанса сжатия , передать encoderSpecification CFDictionary, содержащий этот ключ и EncoderID в качестве значения. EncoderID CFString может быть получен из записи kVTVideoEncoderList_EncoderID в массиве, возвращаемом VTCopyVideoEncoderList.

Вы должны установить kVTCompressionPropertyKey_AverageBitRate и kVTCompressionPropertyKey_DataRateLimits свойства после создания сеанса с помощью функции VTSessionSetProperty.

Например:

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

Просто помните, что kVTCompressionPropertyKey_AverageBitRate принимает биты и байты kVTCompressionPropertyKey_DataRateLimits занимает и секунды.

+0

Спасибо! Я уже нашел решение, но ваш ответ помог мне понять, почему я должен так поступать. – sage444

+0

Так что я понимаю, что вы устанавливаете значение AverageBitRate равным 600 кбит/с, а вы устанавливаете DataRateLimits на 800 кбит/с. Это означает, что вы должны бить на скорости около 600 кбит/с и не превышать 800 Кбит/с. Что мешает снизить скорость передачи данных до 600 Кбит/с? Лично я столкнулся с множеством проблем с битрейтом, пытаясь заставить его оставаться на постоянной скорости без массивных всплесков или капель, но, похоже, он не может этого сделать.Я использую то же самое, чтобы установить его так, как вы. – Charlie