0

Nvidias NvEnc API を使用してハードウェア エンコーダーを構築しようとしています。この API は、任意のデータをエンコードするために、H264 と HEVC の 2 つのコーデックを使用します。したがって、最初に 2 つのコードのいずれかを選択し、その後、エンコード セッションを構成するか、さまざまなプリセットのいずれかを使用する必要があります。Nvidias NvEnc Programming Guideで説明されているようにやっています。

HVECコーデックを使用しているときに問題を引き起こす次のコードがあります:

//Create Init Params
InitParams* ip = new InitParams();

ip->encodeGUID = m_encoderGuid; //encoder GUID is either H264 or HEVC
ip->encodeWidth = width;
ip->encodeHeight = height;
ip->version = NV_ENC_INITIALIZE_PARAMS_VER;
ip->presetGUID = m_presetGuid; //One of the presets
ip->encodeConfig = NULL; //If using preset, further config should be set to NULL

//Async Encode
ip->enableEncodeAsync = 1;

//Send the InputBuffer in Display Order
ip->enablePTD = 1;

//Causing Div by Zero error if used with HEVC GUID:
CheckApiError(m_apiFunctions.nvEncInitializeEncoder(m_Encoder, ip));

繰り返しになりますが、私は H264 GUID を使用しており、すべてが実行されます。HEVC を使用すると、Div by Zero が表示されます... API 呼び出しからエラー コードが表示されず、単純な div by zero エラーが表示されます。私の質問は次のとおりです: HEVC には、プリセットを使用して提供していない情報が必要ですか? もしそうなら、どのような情報ですか?

どうもありがとう!

編集:解決しました。プログラミング ガイドには、これらのフィールドを設定する必要があるとは記載されていませんでしたが、NV_ENC_INITIALIZE_PARAMSframeRateNumframeRateDenで構成されているため、div がゼロになりました... H264 を使用しているときにこれが発生しない理由はわかりません。誰かがこれを閉じるかもしれません..

4

1 に答える 1

0

NVidiasプログラミングガイドによると、これは私が行った構成です。前述のように、frameRateNum と frameRateDen の値を指定しないと、特に最初の memset の後で Div by Zero エラーが発生しました。

//Create Init Params
InitParams* ip = new InitParams();
m_initParams = ip;
memset(ip, 0, sizeof(InitParams));

//Set Struct Version
ip->version = NV_ENC_INITIALIZE_PARAMS_VER;

//Used Codec
ip->encodeGUID = m_encoderGuid;

//Size of the frames
ip->encodeWidth = width;
ip->encodeHeight = height;

//Set to 0, no dynamic resolution changes!
ip->maxEncodeWidth = 0;
ip->maxEncodeHeight = 0;

//Aspect Ratio
ip->darWidth = width;
ip->darHeight = height;

// Frame rate
ip->frameRateNum = 60;
ip->frameRateDen = 1;

//Misc
ip->reportSliceOffsets = 0;
ip->enableSubFrameWrite = 0;

//Preset GUID
ip->presetGUID = m_presetGuid;

//Apply Preset
NV_ENC_PRESET_CONFIG presetCfg;
memset(&presetCfg, 0, sizeof(NV_ENC_PRESET_CONFIG));
presetCfg.version = NV_ENC_PRESET_CONFIG_VER;
presetCfg.presetCfg.version = NV_ENC_CONFIG_VER;
CheckApiError(m_apiFunctions.nvEncGetEncodePresetConfig(m_Encoder,
    m_encoderGuid, m_presetGuid, &presetCfg));
// Copy the Preset Config to member var
memcpy(&m_encodingConfig, &presetCfg.presetCfg, sizeof(NV_ENC_CONFIG));
/************************************************************************/
/* Room for Config Adjustments                                          */
/************************************************************************/

//Set Init configs encoding config
ip->encodeConfig = &m_encodingConfig;

//Async Encode!
ip->enableEncodeAsync = 1;

//Send the InputBuffer in Display Order
ip->enablePTD = 1;


CheckApiError(m_apiFunctions.nvEncInitializeEncoder(m_Encoder, ip));
于 2016-07-27T11:26:37.737 に答える