2016-07-16 16 views
0

Nvidias NvEnc API를 사용하여 하드웨어 인코더를 제작하려고합니다. 이 API는 주어진 데이터를 인코딩하기 위해 H264 및 HEVC의 두 코덱을 사용합니다. 먼저 두 코드 중 하나를 선택하고 나중에 인코딩 세션을 구성하거나 varios 사전 설정 중 하나를 사용해야합니다. 나는 Nvidias NvEnc Programming Guide에 설명 된 것과 같이하고있다. HVEC가있는 Nvidia NvEnc이 Div를 0으로 만듭니다.

//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를 사용하고 모든 것을 통해 실행

나는 HVEC 코덱을 사용할 때 문제를 일으키는 코드의 다음과 같은 부분이있다. HEVC를 사용하는 경우 Div by Zero를 얻습니다 ... API 호출에서 오류 코드를 얻지 못합니다. 제로 오류로 일반 div 만 가져옵니다. 내 질문은 : HEVC는 사전 설정을 사용하여 제공하지 않는 추가 정보가 필요합니까? 그렇다면 어떤 정보입니까?

고맙습니다.

편집 : 해결. 프로그래밍 가이드이 필드를 설정해야합니다 것을 언급하지 않았지만, NV_ENC_INITIALIZE_PARAMS이가 0으로 사업부를 발생 frameRateNumframeRateDen 구성 ... H264을 사용하는 경우이 발생하지 않는 이유를 몰라. 누군가가 이것을 닫을 수 있습니다 ..

+0

해결책을 짧은 답변으로 추가하십시오. 자신의 질문에 대답하는 것은 완벽하게 OK입니다. 이렇게하면이 질문이 삭제되지 않고 솔루션이 검색 결과에 표시됩니다. – talonmies

답변

0

이것은 NVidias 프로그래밍 가이드에 따르면 내가 수행 한 구성입니다. 위에서 설명한 것처럼 frameRateNum 및 frameRateDen 값을 제공하지 않으면 Div가 0으로 오류가 발생합니다. 특히 초기 memset 이후입니다.

//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));