1

libx265 を使用して Web カメラから画像をエンコードしようとしています (libx264 は以前に試しました) ...
マトリックスに入る光の量が異なり、結果として遅延が異なるため、Web カメラは安定した FPS で撮影できません。したがって、着信フレームの fps と dts をカウントし、これらの値をx265_imageオブジェクトの対応するパラメーターに設定し、エンコーダーfpsNumを 1000 とfpsDenom1 (ミリ秒タイムベース) で初期化します。
問題は、エンコーダーが入力画像の pts と dts を無視し、1000 fps でエンコードすることです! タイムベースで同じトリックを使用すると、libvpx でスムーズな記録が得られます。x264/x265 コーデックで動作しないのはなぜですか?

パラメータの初期化は次のとおりです。

...
    error = (x265_param_default_preset(param, "fast", "zerolatency") != 0);
    if(!error){
        param->sourceWidth = width;
        param->sourceHeight = height;
        param->frameNumThreads = 1;
        param->fpsNum = 1000;
        param->fpsDenom =  1;
        // Intra refres:
        param->keyframeMax = 15;
        param->intraRefine = 1;
        // Rate control:
        param->rc.rateControlMode = X265_RC_CQP;
        param->rc.rfConstant = 12;
        param->rc.rfConstantMax = 48;
        // For streaming:
        param->bRepeatHeaders = 1;
        param->bAnnexB = 1;
        encoder = x265_encoder_open(param);
        ...
    }
...

フレーム追加機能は次のとおりです。

bool hevc::Push(unsigned char *data){
    if(!error){
        std::lock_guard<std::mutex> lock(m_framestack);
        if( timer > 0){
            framestack.back()->dts = clock() - timer;
            timer+= framestack.back()->dts;
        }
        else{timer = clock();}
        x265_picture *picture = x265_picture_alloc();
        if( picture){
            x265_picture_init(param, picture);
            picture->height = param->sourceHeight;
            picture->stride[0] = param->sourceWidth;
            picture->stride[1] = picture->stride[2] = picture->stride[0] / 2;
            picture->planes[0] = new char[  luma_size];
            picture->planes[1] = new char[chroma_size];
            picture->planes[2] = new char[chroma_size];

            colorspaces::BGRtoI420(param->sourceWidth, param->sourceHeight, data, (byte*)picture->planes[0], (byte*)picture->planes[1], (byte*)picture->planes[2]);
            picture->pts = picture->dts = 0;
            framestack.emplace_back(picture);
        }
        else{error = true;}
    }
    return !error;
}

x265_encoder_encodeグローバル PTS は、呼び出し 直後に増加しています:エンコーダーに関しては、キューpts+= pic_in->dts;からの新しい画像のポイントとして設定されます。framestack

x265/x264 コーデックは可変 fps でエンコードできますか? はいの場合、どのように設定しますか?

4

1 に答える 1