Chcę zakodować po wyszukaniu określonej pozycji i chcę, aby pierwsza klatka była klatką kluczową, tutaj użyłem polecenia:
ffmpeg -ss 300 -i howimet.mp4 -acodec libfaac -ar 48000 -ab 128k -ac 2 -vcodec libx264 -vf "scale=480:270" -f mpegts -force_key_frames 300 -t 120 howimet2.ts
-force_key_frames jest ustawiony na szukanie pozycji, aby utworzyć tam klatkę kluczową. Używam następującego skryptu ( stąd ), aby sprawdzić, czy pierwsza klatka jest klatką kluczową
ffprobe -show_frames -v quiet howimet2.ts | awk -F= ' /pict_type=/ { if (index($2, "I")) { i=1; } else { i=0; } }
/pkt_pts_time/ { if (i && ($2 >= 0)) print $2; }
' | head -n 1
Wynik pokazuje, że pierwsza klatka kluczowa nie jest zlokalizowana w drugim 0.
Wydaje mi się, że moje polecenie jest nieprawidłowe. czego mi brakuje?
-force_key_frames 0
. Powodem, dla którego tego chcę, jest implementacja segmentatora ffmpeg, który będzie generował segment HSL w locie. Gdy użytkownik szuka pozycji, segmentator powinien być w stanie wygenerować odpowiedni segment; segment zostanie wysłany do odtwarzacza klienta (odtwarzacz filmów na iOS); domyślnie odtwarzacz rozpocznie odtwarzanie od pierwszej klatki kluczowej w odebranym segmencie. Chcę, aby gracz zaczął grać od pierwszej klatki. Mam nadzieję, że moje wyjaśnienie ma sens
-vcodec libx264
, FFmpeg zrobi to, co otrzyma zdekodowane zdjęcie, poda je do x264, a pierwszą rzeczą, którą zrobi x264, jest utworzenie klatki kluczowej. Nie można rozpocząć filmu z ramką bez odniesienia. Jeśli ręcznie sprawdzisz wynik ffprobe
, co to powie o pierwszej ramce?
ffprobe -v quiet -print_format json -show_streams howimet2.ts
mówi mi to "start_time": "1.400000"
, czy to jest powód?
-force_key_frames
powinno być względne w stosunku do danych wejściowych, więc 300 też nie ma sensu - powinno być 0, jeśli się nie mylę. Czy wideo jest w porządku, czy dlaczego pytasz? (Innymi