Próbuję zakodować wideo .mp4 z zestawu ramek przy użyciu FFMPEG przy użyciu kodeka libx264.
Oto polecenie, które uruchamiam:
/usr/local/bin/ffmpeg -r 24 -i frame_%05d.jpg -vcodec libx264 -y -an video.mp4
Czasami pojawia się następujący błąd:
[libx264 @ 0xa3b85a0] height not divisible by 2 (520x369)
Po dokładnym przeszukaniu wydaje się, że problem ma coś wspólnego z algorytmem skalowania i można go rozwiązać, dodając argument -vf.
Jednak w moim przypadku nie chcę wykonywać żadnego skalowania. Idealnie chcę zachować wymiary dokładnie takie same jak ramki. Jakakolwiek rada? Czy istnieje jakiś współczynnik proporcji, który wymusza h264?
-vf pad="width=ceil(iw/2)*2:height=ceil(ih/2)*2"
brzmi: nie jest to jedna z odpowiedzi. Prawidłowa odpowiedź na pytanie innych należy do LordNeckbeard."scale="
zamiast tego,"pad="
jeśli on / ona nie chce kolorowych wypełnień?Odpowiedzi:
Odpowiedź na pierwotne pytanie, które nie chce skalować wideo, brzmi:
Komenda:
Zasadniczo .h264 potrzebuje równych wymiarów, więc ten filtr:
Możesz zmienić kolor wypełnienia, dodając parametr filtru
:color=white
. Zobacz dokumentację pada .źródło
-vf pad="width=iw:height=ih+1:x=0:y=0:color=white"
. Dokumentacja pada ffmpeg znajduje się tutaj: ffmpeg.org/ffmpeg-filters.html#pad-1 .-vf pad="width=ceil(iw/2)*2:height=ceil(ih/2)*2"
.Po prostu użyj
-2
Z dokumentacji filtra skali :
Przykłady
Ustaw szerokość na 1280, a wysokość zostanie automatycznie obliczona, aby zachować proporcje, a wysokość będzie podzielna przez 2:
Taki sam jak powyżej, ale zamiast tego z zadeklarowaną wysokością; pozostawiając szerokość, którą ma zająć filtr:
„podzielny przez 2”
Zgodnie z wymaganiami x264, „wyniki podzielne przez 2 dla szerokości i wysokości” są potrzebne dla wyjściowych próbek kolorów YUV 4: 2: 0. 4: 2: 2 wymagałoby „podzielności przez 2 dla szerokości”, a 4: 4: 4 nie ma tych ograniczeń. Jednak większość odtwarzaczy nieopartych na FFmpeg może poprawnie poprawnie dekodować tylko 4: 2: 0, dlatego często wyświetla się
ffmpeg
polecenia z-pix_fmt yuv420p
opcją podczas przesyłania wideo H.264.Zastrzeżenie
Niestety nie możesz używać
-2
zarówno szerokości, jak i wysokości, ale jeśli już określiłeś jeden wymiar, użycie-2
jest prostym rozwiązaniem.źródło
-vf scale=-2:-2
nie działa? W moim przypadku chcę zachować maksymalny rozmiar oryginalnego pliku. To, co zadziałało, było dla mnie-vf scale=-2:ih
. Ale to nie działa, jeśli oba h / w są nierówne.-2
zależy od deklarowanej wartości innego wymiaru.Size values less than -1 are not acceptable.
ale odpowiedź @Zbyszek działała idealnie.ffmpeg
. Możesz pobrać kompilację statyczną .Jeśli chcesz ustawić szerokość wyjściową i mieć wyjściowy w takim samym stosunku jak oryginał
i nie wpaść w ten problem, możesz użyć
(Tylko dla osób szukających tego, jak to zrobić za pomocą skalowania)
źródło
scale="trunc(oh*a/2)*2:720"
Problem z
scale
rozwiązaniami tutaj polega na tym, że zniekształcają obraz / wideo źródłowe, co prawie nigdy nie jest tym, czego chcesz.Zamiast tego znalazłem najlepsze rozwiązanie, aby dodać 1-pikselowy pad do nieparzystego wymiaru. (Domyślnie wypełnienie jest czarne i trudne do zauważenia.)
Problem z innymi
pad
rozwiązaniami polega na tym, że nie generalizują one dowolnych wymiarów, ponieważ zawsze padają.To rozwiązanie dodaje pad 1-pikselowy tylko do wysokości i / lub szerokości, jeśli są nieparzyste:
Jest to idealne rozwiązanie, ponieważ zawsze robi to dobrze, nawet gdy nie jest konieczne wypełnianie.
źródło
scale=iw+mod(iw,2):ih+mod(ih,2):flags=neighbor
. Może to zwiększyć każdy wymiar tylko o 1, w razie potrzeby, i powieli ostatni wiersz / kolumnę.Jest to prawdopodobnie spowodowane faktem, że wideo H264 jest zwykle konwertowane z przestrzeni RGB na przestrzeń YUV jako 4: 2: 0 przed zastosowaniem kompresji (chociaż sama konwersja formatu jest algorytmem kompresji stratnej, co daje 50% oszczędności miejsca).
YUV-420 zaczyna się obrazem RGB (czerwony zielony niebieski niebieski) i konwertuje go na YUV (w zasadzie jeden kanał intensywności i dwa kanały „odcienia”). Kanały odcienia są następnie podpróbkowane przez utworzenie jednej próbki odcienia dla każdego kwadratu 2 x 2 tego odcienia.
Jeśli masz nieparzystą liczbę pikseli RGB, poziomo lub pionowo, będziesz mieć niekompletne dane dla ostatniej kolumny lub wiersza pikseli w podpróbkowanej przestrzeni barwy ramki YUV.
źródło
Lord Neckbeard ma właściwą odpowiedź, bardzo szybko
Dla Androida nie zapomnij dodać
źródło
--disable-asm
w swoim skrypcie kompilacji x264 . Powoduje to niepotrzebne i znaczne spowolnienie (możesz sprawdzić dziennik ffmpeg i jeśli pokazuje,using cpu capabilties: none!
że to źle). Nie jestem pewien, dlaczego to dodali, ale nie jestem programistą Androida.Możesz także użyć
bitand
funkcji zamiasttrunc
:bitand (x, 65534)
zrobi to samo co
trunc(x/2)*2
i moim zdaniem jest bardziej przejrzyste.(Rozważ 65534 magiczną liczbę tutaj;))
Moim zadaniem było automatyczne skalowanie wielu plików wideo do połowy rozdzielczości .
scale=-2,ih/2
prowadzić do lekko rozmytych obrazówpowód:
scale
skaluje rzeczywiste wymiary ramkirozwiązanie:
wyjaśnienie:
setsar=1
znaczy wymiary wyjściowe są teraz ostateczne, nie należy stosować korekcji współczynnika kształtuKtoś może uznać to za pomocne.
źródło