【问题标题】:OSX, VideoToolbox, Compression SessionOSX、VideoToolbox、压缩会话
【发布时间】:2015-07-22 15:31:43
【问题描述】:

环境

  • OSX 优胜美地
  • xcode 6.4
  • C++

用例

给定一个由单个关键帧和多个对应的增量帧组成的 h264 GOP,解码 GOP,然后编码单个 4.2Mbit 关键帧

问题描述

我能够解码 GOP 并编码关键帧,但是,生成的关键帧质量低(低比特率),也就是说,尽管我专门将比特率设置为 4.2Mbit (这可以在下面的代码快照中看到),考虑到我只需要一个 单个关键帧,有没有办法设置 VideoToolBox 编码器以输出高比特率关键帧?

const CMVideoCodecType  fourcc  = (CMVideoCodecType)CMVideoFormatDescriptionGetCodecType(fmt);

// Else, generate a h264 KeyFrame

CFObjectSmartPtr< CFMutableDictionaryRef >  dictEncSpec;
dictEncSpec.Attach(CFDictionaryCreateMutable(NULL, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks));
//dictEncSpec.Attach(CFDictionaryCreateMutable(NULL, 0, 0, 0));
// CFDictionarySetNumVal(dictEncSpec, kVTVideoEncoderSpecification_RequireHardwareAcceleratedVideoEncoder, TRUE);
CFDictionarySetValue(dictEncSpec, kVTCompressionPropertyKey_ProfileLevel, kVTProfileLevel_H264_High_3_2);
// CFDictionarySetValue(dictEncSpec, kVTCompressionPropertyKey_RealTime, kCFBooleanTrue);

// CFDictionarySetValue(dictEncSpec, kVTCompressionPropertyKey_H264EntropyMode, kVTH264EntropyMode_CABAC);

CFDictionarySetNumVal(dictEncSpec, kVTCompressionPropertyKey_AverageBitRate, 4200000);
CFDictionarySetNumVal(dictEncSpec, kVTCompressionPropertyKey_Quality, 1.0f);
CFDictionarySetNumVal(dictEncSpec, kVTCompressionPropertyKey_MaxFrameDelayCount, 0);
CFDictionarySetNumVal(dictEncSpec, kVTCompressionPropertyKey_MaxKeyFrameIntervalDuration, 1);
CFDictionarySetNumVal(dictEncSpec, kVTCompressionPropertyKey_ExpectedDuration, 1);
CFDictionarySetNumVal(dictEncSpec, kVTCompressionPropertyKey_ExpectedFrameRate, 10);
// CFDictionarySetNumVal(dictEncSpec, kVTCompressionPropertyKey_SourceFrameCount, 1);
CFDictionarySetNumVal(dictEncSpec, kVTVideoEncoderSpecification_EnableHardwareAcceleratedVideoEncoder, TRUE);

CFObjectSmartPtr< VTCompressionSessionRef > sessionCompression;
status = VTCompressionSessionCreate(0, res.width, res.height, fourcc, (CFDictionaryRef)dictEncSpec, 0, 0, CompressionCallback, &ctx, &sessionCompression);
if (noErr != status)
    return HRESULT_FROM_ERRNO(status);
if (noErr != (status = VTCompressionSessionEncodeFrame(sessionCompression, ctx.yuvFrame, timestamp, timestamp, 0, 0, 0)))
    return HRESULT_FROM_ERRNO(status);
if(noErr != (status = VTCompressionSessionCompleteFrames(sessionCompression, timestamp)))
    return HRESULT_FROM_ERRNO(status);
if (0 == ctx.keyFrame) {
    assert(false);
    return E_UNEXPECTED;
}

ctx.keyFrame最终质量非常低

【问题讨论】:

  • 如果更改 H264 配置文件有什么影响吗?
  • 很遗憾,没有,没有影响
  • 我最终使用了 libx264 而不是 VideoToolBox
  • @NadavRub 同步怎么样??,我的质量很好,但速度很慢(几分之一秒)

标签: c++ macos video-toolbox


【解决方案1】:

还有一个你需要关心的因素,在创建 VTCompressionSession 之后,你需要在 VTCompressionSessionEncodeFrame 中正确设置你的帧时间戳。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-09
    • 1970-01-01
    • 2013-01-18
    • 2010-11-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多