2013-01-23 3 views
1

저는 인생 스트림 소프트웨어를 만들고자합니다. 내가 노력하고있는 것은 서버 측에서 h264로 인코딩하고 클라이언트 측에서 디코딩하는 ffmpeg로 x264의 lib를 사용하는 것이다. 일부 작업을 시도한 직후에 단순화하기로 결심했습니다. 먼저 x264_encoder_encode로 프레임을 인코딩하고 결과 NAL을 파일에 쓰는 것입니다. 이제 그 파일이 맞는지 테스트하고 싶습니다.x264_encoder_encode 출력을 h264 파일에 출력합니다.

내가 인코더 초기화 : 나는 이미지 (RGBA 이미지)이있을 때 나는 YUV420P로 변환 한 후 내가 x264_encoder_encode 전화 그리고

x264_param_t param; 
x264_param_default_preset(&param, "veryfast", "zerolatency"); 
param.i_threads = 1; 
param.i_width = a_iWidth; 
param.i_height = a_iHeight; 
param.i_fps_num = a_iFPS; 
param.i_fps_den = 1; 
param.i_keyint_max = a_iFPS; 
param.b_intra_refresh = 1; 
param.rc.i_rc_method = X264_RC_CRF; 
param.rc.i_vbv_buffer_size = 1000000; 
param.rc.i_vbv_max_bitrate =500; //For streaming: 
param.b_repeat_headers = 1; 
param.b_annexb = 1; 
x264_param_apply_profile(&param, "baseline"); 
encoder = x264_encoder_open(&param); 

을 :

int frame_size = x264_encoder_encode(encoder, &nals, &num_nals, picture, &pic_out); 
if (frame_size > 0) 
{ 
    m_vNALs.push_back((char*)nals[0].p_payload); 
    m_vSizes.push_back(frame_size); 

    return frame_size; 
} 

모든 것이 나타납니다 frame_size가 0이 아닌 양수 값을 반환하고 다른 모든 매개 변수가 ok로 표시됩니다. 모든 NAL은 올바른 코드로 시작합니다.

그래서 내가 파일에 모든 NALS을 쓰고 있어요 :
FILE* pFile; 
pFile = fopen("file.h264", "wb"); 
for(int nIndex = 0; nIndex < m_vNALs.size(); nIndex++) 
{ 
    fwrite(m_vNALs[ nIndex ], m_vSizes[ nIndex ], 1, pFile); 
} 

는 지금은 file.h264 파일이 있습니다. 그래서 내가 ffmpeg.exe (나는 창문에있어)를 사용하여이 파일을 테스트합니다, 나는이 출력 얻을 :

[h264 @ 00000000021c5a60] non-existing PPS referenced 
[h264 @ 00000000021c5a60] non-existing PPS 0 referenced 
[h264 @ 00000000021c5a60] decode_slice_header error 
[h264 @ 00000000021c5a60] no frame! 
[h264 @ 00000000021c5a60] non-existing PPS referenced 
[h264 @ 00000000021b74a0] max_analyze_duration 5000000 reached at 5000000 
[h264 @ 00000000021b74a0] decoding for stream 0 failed 
[h264 @ 00000000021b74a0] Could not find codec parameters for stream 0 (Video: h 
264): unspecified size 
Consider increasing the value for the 'analyzeduration' and 'probesize' options 
[h264 @ 00000000021b74a0] Estimating duration from bitrate, this may be inaccura 
te 
file.h264: could not find codec parameters 

VLC 또한 파일을 재생할 수 있습니다.

ffplay는 말한다 :

은 어떤 문제가
file.h264: Invalid data found when processing input 

????? 당신은 단지 포인터와 크기 x264_encoder_encode에 의해 반환되는 실제되지 않은 데이터를 저장처럼 사전에

감사합니다, Zetlb

답변

1

보인다. 다음에 x264_encoder_encode/x264_encoder_close를 호출하기 전에

m_vNALs.push_back((char*)nals[0].p_payload); 
m_vSizes.push_back(frame_size); 

이 뾰족한 데이터

에만 유효합니다.

+0

감사합니다. 그것은 작동, 문제는 내가 데이터 포인터가 "영원히"유효하다고 가정했다 ... –

+0

안녕하세요 @ Zetlb. 나는 비슷한 문제가있다. 나는 ffmpeg를 통해 x264를 사용하고 있습니다. 어떻게 그렇게 할 수 있습니까? – nmxprime

+0

안녕하세요, 저는 [X264] (http://www.videolan.org/developers/x264.html)를 사용하여 프레임을 인코딩하고 [ffmpeg] (http://www.ffmpeg.org/)가 아닌 NAL을 얻습니다. 또한 ffmepg를 사용하여 NAL을 디코드하고 인코딩 된 프레임을 다시 얻습니다. 내가 인코딩하는 데 ffmpeg를 사용하는 데 문제가 있다고 생각한다. Windows 환경에서 작업 라이브러리를 얻는 것이 쉽지 않았다. –

1

h.264 파일 헤더를 h.264 파일에 쓰는 것을 잊어 버린 것 같습니다.