STRESZCZENIE: Próbuję dowiedzieć się (jak sądzę, przykład), jak używać skalera tagi src_format / dst_format do konwersji do określonego formatu RGB 16 bpp dla urządzenia docelowego.
Mam do czynienia ze starszym sprzętem, który odtwarza filmy z małej karty SD o pojemności 64 MB. Tak, MB. Wyświetlacz ma tylko 640 x 480, a ostatnio doszedłem do wniosku, że ma 16-bitowy sterownik wideo, który moim zdaniem to RGB 5: 6: 5. Ten ostatni utwór jest nowy i prawdopodobnie wyjaśnia, dlaczego pliki wejściowe, które miały wypełnienia gradientem w sekcjach animacji, wykazują dziwne pasmowanie - wiele migotliwych bloków.
Pliki wejściowe to mieszanka rzeczy - pliki wideo o różnych rozmiarach pochodzą z całego (ale 45 sekund lub mniej), a ja używam FFMPEG do konwersji z formatu wejściowego na format docelowy:
Kontener AVI XVID wideo o rozdzielczości 300 kb / s Audio MP3 o rozdzielczości 96 kb / s mono lub stereo 640x480 w celu dopasowania do małego rozmiaru pliku na ekranie, aby 10 lub więcej plików mogło zmieścić się na karcie SD wraz z programem do zapętlania odtwarzania (jest to stary i niski poziom technologii według dzisiejszych standardów, urządzenia i nie można go zmienić z kilku powodów)
Miałem konfigurację konwersji uruchomioną kilka tygodni temu dla pierwszej partii konwersji, ale ludzie nie byli zadowoleni z jakości danych wyjściowych, a MediaInfo wciąż raportowało, że szybkość transmisji bitów jest znacznie wyższa niż pożądana wartość 300K.
Korzystałem z kodeka libxvid, ale faktycznie zarejestrowano błąd (# 6217), który wskazuje, że atrybut -b: v 300K nie działa z tym, ale że kodek mpeg4 działa. Niektóre eksperymenty przeprowadzone w ciągu ostatnich kilku dni pozwalają mi w to uwierzyć. Odkryłem również, że mogę zwiększyć docelową przepływność do około 500 kb / s za pomocą kodeka MPEG4 i uzyskać plik wyjściowy o rozsądnej wielkości (około 3 MB dla pliku 40s).
Do tej pory skończyłem z tym:
ffmpeg -y -i "input.mp4" -s 640x480 -aspect 4:3 -vf fps=24 -g 12 -c:v mpeg4 -vtag xvid -src_format yuv420p -sws_flags full_chroma_int+accurate_rnd+lanczos -b:v 500k -pass 1 -an -f avi NUL
ffmpeg -y -i "input.mp4" -s 640x480 -aspect 4:3 -vf fps=24 -g 12 -c:v mpeg4 -vtag xvid -sws_flags full_chroma_int+accurate_rnd+lanczos -b:v 500k -pass 2 -c:a libmp3lame -b:a 96k "output.avi"
Dostaję pliki, które działają na urządzeniu, ale sekcje gradientu są bardzo blokowe i często migoczą, a obszary, które mają duży prostokąt w czerwonym odcieniu, mają wszelkiego rodzaju artefakty podczas odtwarzania na urządzeniu docelowym. Artefakty są również widoczne, gdy odtwarzam wideo wyjściowe w VLC na moim laptopie z systemem Windows. Po prostu wyglądają gorzej na urządzeniu docelowym.
Próbowałem użyć opcji -q: vn (gdzie n było między 2 a 8) - jakość była nieco lepsza, ale rozmiar pliku był niepraktyczny.
I zdaję sobie sprawę, że toczę ciężką bitwę, próbując uzyskać przyjemny film, kiedy zmniejszam się do rozmiaru wyjściowego i próbuję znacznie wyciąć wynikowy plik.
Jednak w mojej ogromnej liczbie Googlingów natknąłem się dziś na coś odnoszącego się do konwersji pikseli z YUV (czyli, jak mówią MediaInfo, moje szczególne pliki testowe) na 16bpp RBG. Ale nie mogę dowiedzieć się, co to jest właściwe inkantacja, aby spróbować wygenerować plik wyjściowy, który próbuje uwzględnić niższą głębię kolorów mojego urządzenia. Próbowałem kilku rzeczy, które sprzeciwiły się mojemu dodaniu -dst_format rgb565le do mojego wiersza poleceń.
Czy ktoś może to wyjaśnić lub wskazać mi próbkę, w której odbywa się to w wierszu polecenia? Dzięki.
źródło
mpeg4
obsługuje tylko yuv420p.