2013-06-03 9 views
0

간단히 말해서, 스트림을 다시 인코딩하지 않고도 훨씬 더 큰 비디오 프레임을 인코딩하여 더 큰 h.264 스트림 앞에 스티칭해야합니다.기존 스트림과 일치하도록 인코딩 h264

세부 정보 : h.264 es와 오디오가 포함 된 멀티 GB 전송 스트림을 수신합니다. 현재 h.264 스트림은 항상 x264를 사용하여 생성되며 앞으로는이 경우가 될 것으로 예상 할 수 있습니다. 이제 일부 비디오 프레임을이 스트림에 추가해야하지만 전체 스트림을 디코딩/인코딩 할 수는 없습니다. 두 개의 스트림이 일치하도록 x264_encoder_open을 전달하는 데 필요한 정확한 매개 변수를 찾을 수있는 유일한 옵션이 있습니다. 원래 TS

  1. 디 먹스 및 H.264 NAL 패킷을 추출 :

    현재 내가 뭘 것입니다.

  2. "사용자 데이터 등록되지 않은"SEI 패킷을 발견하면이를 구문 분석하고 x264 매개 변수를 찾습니다.
  3. 비디오 디코딩을 시작하려면 libavcodec을 사용하십시오. AVCodecContext 구조에서 그림의 크기와 h264 프로필 및 레벨을 얻을 수 있습니다.
  4. x264_param_t 구조에서 가능한 한 최선을 다하십시오.

인코딩을 할 수 있으며 인코딩 된 비디오가 정확하게 연결 지점까지 재생됩니다. VLC는 스티치 포인트에 도달 될 때 메시지의 다음과 같은 순서를 밖으로 던지기 시작하고 곧 중지 재생 후 :

[h264 @ 0x7fe36cd75be0] decode_slice_header error 
[h264 @ 0x7fe36cd75be0] no frame! 
[h264 @ 0x7fe36ccc9080] Width/height changing with threads is not implemented. Update your Libav version to the newest one from Git. If the problem still occurs, it means that your file has a feature which has not been implemented. 

분명히 내 인코딩 된 프레임이 원래의 것과 일치하지 않는 것을 알 수있다. 나는 소스 코드를 탐색 해왔고이를 수행하는 방법을 찾지 못하고있다. 내가 현재 가지고있는 것 (작동하지 않는 것)은 많은 추측을 필요로하기 때문에 필자가 갖고있는 예제 파일 중 일부를 작동시킬 수 있다고하더라도 프로덕션 서버에이 파일을 배포하는 것은 무서울 것입니다.

명백한 질문은 다음과 같습니다. 안전하고 공식적인 방법이 있습니까?

감사의 말

답변

0

마침내 나는 그것을 직접 해결했다. 이미지 크기와 종횡비를 일치시켜야하기 때문에 다음과 같이 간단 할 수 있습니다.

x264_param_t xparam ; 
x264_param_default(&xparam); 

xparam.i_width   = width ; 
xparam.i_height   = height ; 
xparam.vui.i_sar_height = 1  ; 
xparam.vui.i_sar_width = 1  ; 

x264_t * x264 = x264_encoder_open(&xparam);