Aby działać poprawnie, najpierw przekonwertuj wideo na strumień bitów RAW YUV (jeśli jeszcze nie jest):
ffmpeg -i input.mp4 -an -vcodec rawvideo -pix_fmt yuv420p rawbitstream.yuv
Następny krok: select
filtr przyjmuje wyrażenie , gdzie n
jest numer klatki.
ffmpeg -r 2 -s WxH -i rawbitstream.yuv -filter:v select="mod(n-1\,2)" \
-c:v rawvideo -r 1 -format rawvideo -pix_fmt yuv420p -an odd.yuv
ffmpeg -r 2 -s WxH -i rawbitstream.yuv -filter:v select="not(mod(n-1\,2))" \
-c:v rawvideo -r 1 -format rawvideo -pix_fmt yuv420p -an even.yuv
Aby ffmpeg
nie powielać klatek, musisz wymusić połowę liczby klatek na sekundę na wejściu - więc ustawisz „2” jako wejście, a „1” na wyjście. Nie zapomnij zastąpić WxH rzeczywistymi wymiarami klipu, ponieważ surowy strumień bitów nie ma nagłówka, który przenosi te informacje.
Zamiast powyższego inną możliwością byłoby dodanie setpts
filtra w celu ustawienia nowych znaczników czasu dla danych wyjściowych. Ale bądź ostrożny, ponieważ nie wyświetla dokładnie klatek. Tutaj 25 to rzeczywista liczba klatek na sekundę, którą chcesz:
ffmpeg -i input.mp4 -filter:v select="mod(n-1\,2)",setpts="N/(25*TB)" \
-c:v rawvideo -r 12.5 -format rawvideo -pix_fmt yuv420p -an odd.yuv
ffmpeg -i input.mp4 -filter:v select="not(mod(n-1\,2))",setpts="N/(25*TB)" \
-c:v rawvideo -r 12.5 -format rawvideo -pix_fmt yuv420p -an even.yuv
Możesz oczywiście wybrać inny format pikseli (dowolny ffmpeg -pix_fmts
). Upewnij się, że podczas czytania pliku znasz rozmiar i format pikseli:
ffmpeg -f rawvideo -s:v 1280x720 -pix_fmt yuv420p input.yuv …