2013-04-22 4 views
0

это право использовать новый x264 api, я хочу получить фрейм и закодировать его с помощью x264, а затем сохранить его в файл .264? но я не знаю, это правильно?Это право, когда я использую x264?

picIn.img.plane[0] = pInBuffer ; 
picIn.img.plane[1] = pInBuffer +m_VideoEncParam.nWidth*m_VideoEncParam.nHeight ; 
picIn.img.plane[2] = pInBuffer +m_VideoEncParam.nWidth*m_VideoEncParam.nHeight*5/4 ; 

picIn.img.i_stride[0] = m_VideoEncParam.nWidth ; 
picIn.img.i_stride[1] = m_VideoEncParam.nWidth /2 ; 
picIn.img.i_stride[2] = m_VideoEncParam.nWidth /2 ; 

nRet = x264_encoder_encode(
          m_pX264Handle, 
          &pNal, 
          &nNalCount, 
          &picIn, 
          &picOut); 
if (nRet<0) 
{ 
    return -1 ; 
} 

for (int i = 0 ;i<nNalCount ; i++) 
{ 


    //memcpy(pOut+nLenOut,&pNal[i],pNal[i].i_payload) ; 
    x264_nal_encode(m_pX264Handle,pOutBuffer+nLenOut,&pNal[i]); 
    nLenOut += pNal[i].i_payload ; 
} 
int nSize = 0 ; 
FILE *pFile = fopen(pchFileName,"w") ; 
if (!pFile) 
{ 
    return -1 ; 
} 
nSize = fwrite(pOutBuffer,1,nLenOut,pFile) ; 
fclose(pFile) ; 
+3

Ну, это работает? – JJJ

ответ

1

Нет. Это не так, по крайней мере, в том, что вы называете x264_nal_encode на выходе. Текущие (не старше 2 лет) версии libx264 return уже экранированы nals (x264_nal_encode требуется только в случае функции обратного вызова nalu_process). Также вам не нужно вычислять сумму размеров NAL, потому что положительное значение nRet уже является этой суммой. И вы можете написать pNal [0] .p_payload с размером nRet напрямую, потому что полезная нагрузка всех выходных NAL гарантирована последовательностью в памяти API.