2013-03-17 9 views
5

Po przykładach plików ffmpeg: decoding_encoding.c i filtering_video.c, przetwarzam jeden plik wideo pobrany przez iPhone'a. Plik wideo: .mov, wymiary wideo; 480x272, wideo Kodek: H.264/AVC, 30 klatek na sekundę, szybkość transmisji: 605 kb/s.Dlaczego frame-> pts zwiększa się o 20, a nie o 1?

Najpierw rozpakowuję każdą klatkę, która jest YUV. Konwertuję YUV na RGB24 i przetwarzam RGB24, a następnie zapisuję RGB24 w pliku .ppm. Pokazuje, że plik .ppm jest poprawny.

Następnie planuję zakodować przetworzone ramki RGB24 do pliku wideo. Ponieważ MPEG nie obsługuje formatu obrazu RGB24, użyłem AV_CODEC_ID_HUFFYUV. Ale wyjściowy plik wideo (pokazujący 18,5 MB) nie jest odtwarzany. Odtwarzacz filmów w systemie Ubuntu zgłasza błąd: Nie można ustalić typu strumienia. Próbowałem również na VCL. To po prostu nie działa, bez żadnych informacji o błędzie.

Moje drugie pytanie brzmi: Dla każdego wydobytego FRAM z pliku wejściowego wideo, mam swoje pts następująco według filtering_video.c:

frame->pts = av_frame_get_best_effort_timestamp(frame);

mogę wydrukować pts każdej ramce, a uważają, że zwiększa się o 20, jak poniżej:

pFrameRGB_count: 0, frame->pts: 0 
pFrameRGB_count: 1, frame->pts: 20 
pFrameRGB_count: 2, frame->pts: 40 
pFrameRGB_count: 3, frame->pts: 60 

Jeżeli rama jest ekstrahowany ramki z wejściowego sygnału wizyjnego, a pFrameRGB_count jest licznik dla przetworzonego ramy w postaci RGB24.

Dlaczego się mylą?

Odpowiedz

5

Filmy wideo w formacie H.264 używają 90 kHz clock do kodowania timestamps. Ponieważ Twój film wideo to 30 fps, delta PTS pomiędzy 2 kolejnymi klatkami powinna być 3000 zamiast 20.

Wartość 20 wskazuje na jedną lub obie z następujących:

  • zegara kodowanie (tj próbkowania) jest nieprawidłowo skonfigurowana (600 Hz) dla danej szybkości 30 fps

  • Twoje klatki na sekundę są skonfigurowane nieprawidłowo (do 4500 fps).

Ogólny wzór obliczenie PTS delta jest:

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

I debugowania uzyskać kontekście kodeka pliku wejściowego sygnału wizyjnego, dec_ctx-> time_base.den = 1200; Znam fps, 30, klikając prawym przyciskiem myszy plik wejściowy wideo, aby sprawdzić jego właściwości (Ubuntu 12.04) Wygląda na to, że czas trwania ramki powinien wynosić 1200/30 = 40 jednostek bazowych. Ale to 20 przy użyciu frame-> pts = av_frame_get_best_effort_timestamp (frame);

pakiet odczytu wejściowego sygnału wizyjnego ma czas trwania = 20

I znaleziono dec_ctx-> ticks_per_frame = 2. Chyba ticks_per_frame powoduje 40 do 20 Może pewne wewnętrzne wzór, na przykład: czas trwania ramki w jednostce bazowej = czas trwania klatki x parametr_księgi_symetrownika (ale wygląda na to, że różni się od tego, co jest powiedziane w dokumencie ffmpeg, np. czas_poziomu jest równy 1/liczba klatek na sekundę.)

0

Myślę, że znajduję odpowiedź. Z powodu braku szczegółowej dokumentacji programu ffmpeg użytkownicy mogą wprowadzać w błąd. Uważam, że aby uzyskać poprawne pts, należy zawsze używać: video_st-> time_base NIE video_st-> codec-> time_base

(a) czas bezwzględny ramki:

transmisji pakietowej> dts * (1/video_st-> time_base.den)

(b), czas bezwzględny, pomiędzy ramą i następnej ramki:

rama główna> repeat_pict * (1/video_st-> time_base.den)

Powiązane problemy