Pomijanie klatki bez ponownego kodowania wideo H.264

1

Mam wideo MP4 / h.264, które zawiera tylko I-Frame. Chcę pominąć jedną z tych klatek I bez ponownego kodowania całego wideo. Próbowałem tego:

ffmpeg -i "file.mp4" -vf select='not(eq(n\,10))' "out.mp4"

Ale oczywiście powoduje to ponowne kodowanie.

Wolałbym, aby rozwiązanie korzystało z ffmpeg, ale każdy program działający w systemie Linux jest w porządku.

Żeby było jasne: wideo nie zawiera żadnej klatki P ani B.

jellyjoe
źródło

Odpowiedzi:

2

Jeśli chcesz usunąć pojedynczą ramkę I, musisz wyodrębnić strumień bitów do formatu załącznika B (np. ffmpeg -i input.mp4 -c:v copy -an output.h264A następnie znaleźć bajty reprezentujące jednostki NAL zawierające ramkę (y), które chcesz usunąć. te bajty do następnego kodu startowego i zapisz strumień.

Możesz też podzielić film, używając -frames:vopcji wyodrębnienia pierwszych n klatek:

ffmpeg -i input.h264 -c: v copy -frames: v n output.h264

Następnie za pomocą tego -ssparametru możesz znaleźć pozycję, w której chcesz zacząć od nowa, i stamtąd wyciąć w ten sam sposób. Możesz znaleźć pozycję, mnożąc n + 1 razy liczbę klatek na sekundę.

Nie ma prostszego sposobu, o którym wiem, jeśli nie chcesz ponownie kodować.

slhck
źródło
Może moje pytanie nie było wystarczająco jasne. Wideo NIE zawiera żadnych klatek P ani B. Czy istnieje jakiś „automatyczny” sposób na usunięcie ramki?
jellyjoe
Ups, przepraszam, napisałem to zbyt pochopnie. Zrewiduję moją odpowiedź jutro, ale w gruncie rzeczy nie. Możesz podzielić film za pomocą opcji -frames: v, a następnie skleić go z powrotem.
slhck