2016-07-16 15 views
0

Nvidias NvEnc APIを使用してハードウェアエンコーダを構築しようとしています。このAPIは、任意のデータを符号化するための2つのコーデック(H264およびHEVC)の使用を提供します。 最初に2つのコードのいずれかを選択し、その後にエンコードセッションを設定するか、またはvariosプリセットの1つを使用する必要があります。私はNvidias NvEnc Programming Guideに記載されているようにしています。Nvidia NvEnc with HVECが0のDivを引き起こす

私は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コールからエラーコードを得ることはできません。 私の質問は次のとおりです。HEVCはプリセットを使用して提供していない情報をさらに必要としますか?もしそうなら、どのような情報ですか?

ありがとうございます!

編集:それを解決しました。プログラミングガイドは、これらのフィールドを設定しなければならないが、H264を使用している場合、この現象が発生しない理由NV_ENC_INITIALIZE_PARAMSは知らん...ゼロでのdivを引き起こしたframeRateNumframeRateDenで構成されていることを、状態ませんでした。誰かがこれを閉じるかもしれません..

+0

解決策を簡単な回答として追加してください。あなた自身の質問に答えることは完全にOKです。そうすることで、この質問が削除されず、ソリューションが検索結果に表示されます。 – talonmies

答えて

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)); 
関連する問題