2013-03-17 1 views
5

ffmpeg : decoding_encoding.c 및 filtering_video.c의 exmaples에 이어 iPhone에서 찍은 비디오 파일 하나를 처리합니다. 비디오 파일 : .mov, 비디오 크기; 480x272, 비디오 코덱 : H.264/AVC, 초당 30 프레임, 비트율 : 605kbps.왜 frame-> pts가 1이 아닌 20만큼 증가합니까?

먼저 YUV 인 각 프레임을 추출합니다. YUV를 RGB24로 변환하고 RGB24를 처리 한 다음 RGB24를 .ppm 파일에 씁니다. .ppm 파일이 정확한지 보여줍니다.

그런 다음 처리 된 RGB24 프레임을 비디오 파일로 인코딩 할 계획입니다. MPEG는 RGB24 그림 형식을 지원하지 않으므로 AV_CODEC_ID_HUFFYUV를 사용했습니다. 그러나 출력 비디오 파일 (18.5MB 표시)은 재생되지 않습니다. Movie Player에서 Ubuntu의 오류라고 주장합니다. 스트림 유형을 결정할 수 없습니다. 나는 또한 VCL에서 그것을 시도했다. 오류 정보 없이는 작동하지 않습니다.

내 두 번째 질문

은 다음과 같습니다 입력 비디오 파일, 나는 그 점을 얻을에서 각각 추출 된 FRAM를 들어 다음과 같이 filtering_video.c에 따라 : 나는 각 프레임의 PTS를 인쇄하고, 그 찾을

frame->pts = av_frame_get_best_effort_timestamp(frame);

아래와 같이 20만큼 증가 :

프레임은 상기 입력 영상에서 추출 된 프레임이고,이 pFrameRGB_count RGB24 형태로 처리 된 프레임에 대한 카운트
pFrameRGB_count: 0, frame->pts: 0 
pFrameRGB_count: 1, frame->pts: 20 
pFrameRGB_count: 2, frame->pts: 40 
pFrameRGB_count: 3, frame->pts: 60 

.

왜 잘못 되었나요?

답변

5

H.264 비디오는 timestamps 인코딩에 90 kHz clock을 사용합니다. 동영상이 30 fps이므로 두 연속 프레임 사이의 PTS 델타는 대신 3000이되어야합니다.

(20)의 값이 다음 중 하나 또는 둘 모두를 나타내는

30 FPS

을의 소정의 프레임 율

  • 인코딩 클럭 (즉, 샘플링 레이트) (600 Hz로) 잘못 구성을

  • 초당 프레임 수가 4500fps로 잘못 구성되었습니다. PTS (δ)를 계산하는

화학식이다 :

PTS delta = (1/fps) * Encoder sampling rate 
0

내가 입력 비디오 파일의 코덱 컨텍스트를 얻을 디버깅 dec_ctx-> time_base.den = 1,200; 입력 비디오 파일을 마우스 오른쪽 버튼으로 클릭하여 속성 (Ubuntu 12.04) 을 확인하면 프레임 속도가 1200/30 = 40 기본 단위 여야합니다. 그러나 frame-> pts = av_frame_get_best_effort_timestamp (frame)을 사용하면 20입니다.

는 입력 영상의 판독 패킷의 지속 시간을 갖는다 =

20 I 발견 dec_ctx-> ticks_per_frame = 2. 내가 ticks_per_frame가 아마 같은 일부 내면 수식이있다 40 20하게 추측 : 프레임 기간 기본 단위 = 프레임 기간 x ticks_per_frame (하지만 그것은 ffmpeg 문서에서 말한 것과 다르다. time_base는 1/frame rate와 같다.)

0

나는 대답을 찾은 것 같아. ffmpeg에 대한 자세한 문서가 없기 때문에 사용자가 오해 할 수 있습니다. 내가 올바른 점을 얻기 위해 것을 발견, 하나는 항상 사용해야합니다 video_st-> time_base하지 video_st-> codec-> time_base

(a)는 프레임의 절대 시간 :

패킷 -> DTS * (1/video_st-> time_base.den)

(b) 프레임과 다음 프레임 사이의 절대 시간 :

프레임 -> repeat_pict * (1/video_st-> time_base.den)