2013-09-27 30 views
5

Pracuję nad otoką API libavformat, która konwertuje pliki MP4 na H.264 i AAC na segmenty MPEG-TS odpowiednie do przesyłania strumieniowego. Po prostu wykonuję prostą kopię strumieniową bez ponownego kodowania, ale pliki, które produkuję, odtwarzają wideo pod numerem 3600 fps zamiast 24 fps.Pliki utworzone za pomocą bezpośredniej kopii strumieniowej przy użyciu funkcji API libavformat firmy FFmpeg są odtwarzane zbyt szybko z szybkością 3600 fps

Oto kilka wyjść z ffprobe https://gist.github.com/chrisballinger/6733678, złamane plik jest poniżej:

r_frame_rate=1/1 
avg_frame_rate=0/0 
time_base=1/90000 
start_pts=0 
start_time=0.000000 
duration_ts=2999 
duration=0.033322 

Ten sam plik wejściowy ręcznie wysłane przez ffmpeg ma odpowiedniej informacji datownika:

r_frame_rate=24/1 
avg_frame_rate=0/0 
time_base=1/90000 
start_pts=126000 
start_time=1.400000 
duration_ts=449850 
duration=4.998333 

wierzę, problem leży gdzieś w moim ustawieniu libavformat tutaj: https://github.com/OpenWatch/FFmpegWrapper/blob/master/FFmpegWrapper/FFmpegWrapper.m#L349, gdzie przekierowałem paczkę kodu z ffmpeg.c, która była wymagana do bezpośredniego kopiowania strumieniowego.

Ponieważ 3600 wydaje się być "magiczną liczbą" (60 * 60), to może być tak proste, jak ja nie odpowiednio ustawić skalę czasową, ale nie mogę się dowiedzieć, gdzie mój kod odbiega od samego ffmpeg/avconv.

Podobne pytanie tutaj, ale nie sądzę, że mam tak daleko, jak ja: Muxing a H.264 Annex B & AAC stream using libavformat with vcopy/acopy

Odpowiedz

1

Zajęło to trochę czasu, ale to jest odpowiedź: https://stackoverflow.com/a/16903982/805882

packet.pts = av_rescale_q(packet->pts, inStream->time_base, outStream->time_base); 
packet.dts = av_rescale_q(packet->dts, inStream->time_base, outStream->time_base); 
2

Właściwie twoje pkt i DTS są pomieszane.

Plik MP4 ma parametry pts i dts zgodnie z podstawą MP4 i przechodzisz te same wartości pts i dts do ts muxer, który działa z zegarem 90000Hz. na przykład, jeśli liczba klatek na sekundę wynosi 30 klatek na sekundę, oznacza to, że będzie wyświetlać klatkę wideo co 3000 znaków.

powinieneś użyć av_rescal_q, aby zmienić pts z mp4 na ts timbase.

+0

Dziękujemy! Nie byłem do końca pewien, jak poprawnie zmienić skalę czasu, ale wydaje mi się, że może to pomóc we właściwym kierunku. Dam ci znać, jak to działa! –