Jestem kompletnym noobem w zakresie edycji wideo, więc wybacz mi, jeśli poproszę o coś absurdalnego.
Dostaję klipy wideo z dekodera. Klipy są plikami AVI:
Resolution: 1920 x 1080 Frames Per Second: 60 Video Format: ITU H.264 Audio Format: MPEG 1 Audio, Layer 3 (MP3)
Rozdzielczość i FPS znacznie wykraczają poza to, czego potrzebuję, więc próbuję uruchomić polecenie, aby zmniejszyć skalę:
ffmpeg -i highres.avi -r 30 -s 960x540 lowerres.avi
Udało mi się zapewnić żądaną rozdzielczość, liczbę klatek na sekundę i mniejszy rozmiar pliku, ale również pogorszyło jakość znacznie bardziej, niż się spodziewałem.
Przyjrzałem się nowemu plikowi i stwierdziłem, że z jakiegoś powodu FFmpeg przekonwertował używany format:
Video Format: FFmpeg MPEG-4 Audio Format: MPEG 1 Audio, Layer 2
Nie jest dla mnie jasne, dlaczego nie użyłby tych samych formatów wyjściowych, co formaty wejściowe. Próbowałem użyć tego polecenia, aby wymusić użycie H.264:
ffmpeg -i highres.avi -r 30 -s 960x540 -f h264 lowerresforceh264.avi
Niestety nie udało się z następującym wynikiem:
ffmpeg version 0.7.3-4:0.7.3-0ubuntu0.11.10.1, Copyright (c) 2000-2011 the Libav developers built on Jan 4 2012 16:21:50 with gcc 4.6.1 configuration: --extra-version="4:0.7.3-0ubuntu0.11.10.1" --arch=i386 --prefix=/usr --enable-vdpau --enable-bzlib --enable-libgsm --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvorbis --enable-pthreads --enable-zlib --enable-libvpx --enable-runtime-cpudetect --enable-vaapi --enable-gpl --enable-postproc --enable-swscale --enable-x11grab --enable-libdc1394 --enable-shared --disable-static WARNING: library configuration mismatch avutil configuration: --extra-version="4:0.7.3ubuntu0.11.10.1" --arch=i386 --prefix=/usr --enable-vdpau --enable-bzlib --enable-libgsm --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvorbis --enable-pthreads --enable-zlib --enable-libvpx --enable-runtime-cpudetect --enable-vaapi --enable-libopenjpeg --enable-gpl --enable-postproc --enable-swscale --enable-x11grab --enable-libdirac --enable-libmp3lame --enable-librtmp --enable-libx264 --enable-libxvid --enable-libvo-aacenc --enable-version3 --enable-libvo-amrwbenc --enable-version3 --enable-libdc1394 --shlibdir=/usr/lib/i686/cmov --cpu=i686 --enable-shared --disable-static --disable-ffmpeg --disable-ffplay avcodec configuration: --extra-version="4:0.7.3ubuntu0.11.10.1" --arch=i386 --prefix=/usr --enable-vdpau --enable-bzlib --enable-libgsm --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvorbis --enable-pthreads --enable-zlib --enable-libvpx --enable-runtime-cpudetect --enable-vaapi --enable-libopenjpeg --enable-gpl --enable-postproc --enable-swscale --enable-x11grab --enable-libdirac --enable-libmp3lame --enable-librtmp --enable-libx264 --enable-libxvid --enable-libvo-aacenc --enable-version3 --enable-libvo-amrwbenc --enable-version3 --enable-libdc1394 --shlibdir=/usr/lib/i686/cmov --cpu=i686 --enable-shared --disable-static --disable-ffmpeg --disable-ffplay avformat configuration: --extra-version="4:0.7.3-0ubuntu0.11.10.1" --arch=i386 --prefix=/usr --enable-vdpau --enable-bzlib --enable-libgsm --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvorbis --enable-pthreads --enable-zlib --enable-libvpx --enable-runtime-cpudetect --enable-vaapi --enable-gpl --enable-postproc --enable-swscale --enable-x11grab --enable-libdc1394 --shlibdir=/usr/lib/i686/cmov --cpu=i686 --enable-shared --disable-static --disable-ffmpeg --disable-ffplay avdevice configuration: --extra-version="4:0.7.3-0ubuntu0.11.10.1" --arch=i386 --prefix=/usr --enable-vdpau --enable-bzlib --enable-libgsm --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvorbis --enable-pthreads --enable-zlib --enable-libvpx --enable-runtime-cpudetect --enable-vaapi --enable-gpl --enable-postproc --enable-swscale --enable-x11grab --enable-libdc1394 --shlibdir=/usr/lib/i686/cmov --cpu=i686 --enable-shared --disable-static --disable-ffmpeg --disable-ffplay avfilter configuration: --extra-version="4:0.7.3-0ubuntu0.11.10.1" --arch=i386 --prefix=/usr --enable-vdpau --enable-bzlib --enable-libgsm --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvorbis --enable-pthreads --enable-zlib --enable-libvpx --enable-runtime-cpudetect --enable-vaapi --enable-gpl --enable-postproc --enable-swscale --enable-x11grab --enable-libdc1394 --shlibdir=/usr/lib/i686/cmov --cpu=i686 --enable-shared --disable-static --disable-ffmpeg --disable-ffplay swscale configuration: --extra-version="4:0.7.3-0ubuntu0.11.10.1" --arch=i386 --prefix=/usr --enable-vdpau --enable-bzlib --enable-libgsm --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvorbis --enable-pthreads --enable-zlib --enable-libvpx --enable-runtime-cpudetect --enable-vaapi --enable-gpl --enable-postproc --enable-swscale --enable-x11grab --enable-libdc1394 --shlibdir=/usr/lib/i686/cmov --cpu=i686 --enable-shared --disable-static --disable-ffmpeg --disable-ffplay postproc configuration: --extra-version="4:0.7.3-0ubuntu0.11.10.1" --arch=i386 --prefix=/usr --enable-vdpau --enable-bzlib --enable-libgsm --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvorbis --enable-pthreads --enable-zlib --enable-libvpx --enable-runtime-cpudetect --enable-vaapi --enable-gpl --enable-postproc --enable-swscale --enable-x11grab --enable-libdc1394 --shlibdir=/usr/lib/i686/cmov --cpu=i686 --enable-shared --disable-static --disable-ffmpeg --disable-ffplay libavutil 51. 7. 0 / 51. 7. 0 libavcodec 53. 6. 0 / 53. 6. 0 libavformat 53. 3. 0 / 53. 3. 0 libavdevice 53. 0. 0 / 53. 0. 0 libavfilter 2. 4. 0 / 2. 4. 0 libswscale 2. 0. 0 / 2. 0. 0 libpostproc 52. 0. 0 / 52. 0. 0 Input #0, avi, from "highres.avi": Metadata: comment : Quality_GOOD encoder : Lavf52.64.2 encoded_by : AverMedia_c281_1.7.2 Duration: 00:01:59.28, start: 0.000000, bitrate: 10263 kb/s Stream #0.0: Video: h264 (High), yuv420p, 1920x1080, 59.94 fps, 59.94 tbr, 59.94 tbn, 119.88 tbc Stream #0.1: Audio: mp3, 48000 Hz, stereo, s16, 128 kb/s [buffer @ 0x8f438a0] w:1920 h:1080 pixfmt:yuv420p [scale @ 0x8f431e0] w:1920 h:1080 fmt:yuv420p -> w:960 h:540 fmt:yuv420p flags:0x4 [libx264 @ 0x8f0fb40] broken ffmpeg default settings detected [libx264 @ 0x8f0fb40] use an encoding preset (e.g. -vpre medium) [libx264 @ 0x8f0fb40] preset usage: -vpre <speed> -vpre <profile> [libx264 @ 0x8f0fb40] speed presets are listed in x264 --help [libx264 @ 0x8f0fb40] profile is optional; x264 defaults to high Output #0, h264, to "lowerresforceh264.avi": Stream #0.0: Video: libx264, yuv420p, 960x540, q=2-31, 200 kb/s, 90k tbn, 30 tbc Stream mapping: Stream #0.0 -> #0.0 Error while opening encoder for output stream #0.0 - maybe incorrect parameters such as bit_rate, rate, width or height
Nie jestem pewien, dlaczego nie mogę tego zrobić. Uruchomienie „ffmpeg -formats” wymienia h264 jako jeden z tych, których mógłby użyć zarówno dla wejścia, jak i wyjścia.
Gdyby ktoś mógł wskazać mi właściwy kierunek, byłbym bardzo wdzięczny. Dzięki.
PS: Używam FFmpeg w wersji 0.7.3-4: 0.7.3-0 na Ubuntu 11.10.
EDYTUJ
Mam znalazłem rozwiązanie, analizując użycie presetów. Po wyszukaniu informacji o ustawieniach wstępnych znalazłem następujący samouczek omawiający je:
http://juliensimon.blogspot.com/2009/01/howto-ffmpeg-x264-presets.html
Musiałem tylko określić kodek i odpowiednie ustawienie wstępne, w ten sposób:
ffmpeg -i highres.avi -r 30 -s 960x540 -vcodec libx264 -vpre medium lowerresforceh264vpremedium.avi
Nadal muszę coś poprawić, ale to w zasadzie to, czego chciałem. Dzięki.
Komentarze
- Na pewno niektórzy ludzie chcą po prostu wiedzieć, jak konwertować pliki Avermedia .avi .mp4, aby odtwarzały się w Mountain Lion / Mavericks < pre > ffmpeg -i 140203-1229.avi -vcodec copy -acodec copy fromavermedia_cog.mp4 < / pre >
Odpowiedź
I ” próbuję pomóc. Po pierwsze, nie rozumiem, dlaczego mówisz, że FFMPEG H.264 nie jest formatem wejściowym?
Nie znam wystarczająco dobrze wiersza poleceń FFMPEG (czy jest ktoś, kto robi? 😉 ). Musi istnieć przełącznik do kodowania wieloprzejściowego. Wiem, że jest kilka wbudowanych ustawień wstępnych, których prawdopodobnie mógłbyś użyć i prawie na pewno robisz to, do czego zmierzasz. Są one zwykle nazywane presetami x264 lub strojem x264. Czy możesz znaleźć coś takiego?
Komentarze
- Dzięki. Twoja rozmowa o presetach pomogła mi znaleźć prawdopodobne rozwiązanie. ' edytuję post, aby pokazać, co zrobiłem.
- Niezłe rozwiązanie. Dodano do mojej kolekcji fragmentów. Dzięki.
- @BigBeagle: Gdy znajdziesz odpowiedź na swoje pytanie, możesz ją opublikować jako odpowiedź. Edycja pytania ma na celu zapewnienie większej jasności pytania. Jak rozumiem, odpowiedzi znajdują się w sekcji odpowiedzi.
Odpowiedź
ffmpeg usunęło swoje ustawienia x264, więc Ustawienie -vpre już nie działa.
Teraz mam skrypt do konwersji plików wideo do formatu obsługiwanego przez mój telefon komórkowy.
ffmpeg -i input.avi -sws_flags lanczos+accurate_rnd -vf "scale=320:240" -c:v libx264 -crf 20 -preset veryslow -profile:v main -tune fastdecode -c:a copy output.mkv
Wyjaśnię każdą opcję
-sws_flags lanczos+accurate_rnd
ta opcja jest algorytmem zmniejszania skali, lanczos jest zalecany, ponieważ wytwarza najmniej artefaktów bez rozmycia, ale tak jest powolny.
-vf "scale=..."
nie wymaga objaśnienia określ rozdzielczość wyjściową.
-crf 20
to jest jakość, 20 jest dobrym końcowym ustawieniem wyjściowym (nie używaj go przed edycją), jest to stała jakość i jest najlepszą opcją, gdy rozmiar pliku nie jest mały i zapewni lepszą jakość przy najniższym rozmiarze pliku niż cokolwiek innego, w przeciwnym razie użyj dwuprzebiegowe dla maksymalnej jakości przy określonym rozmiarze pliku (np. konieczność zmieszczenia go na płycie CD lub DVD), stała szybkość transmisji (np. ) należy używać tylko podczas przesyłania strumieniowego, specjalnym przypadkiem jest„ 0 ”, które jest bezstratne, a zakres tej opcji wynosi od 1 (najwyższa jakość) do 50 (najniższa jakość).
Dobrym testem na to jest przeprowadzenie kodowania z -crf 20, zanotowanie bitrate, a następnie użycie tego jako ustawienia -b dla drugiej wersji pliku, obie powinny mieć ten sam rozmiar pliku, porównaj oba dla różnice w jakości.
-preset veryslow
to określa, ile procesora chcesz używać, tym wolniej jest to mniejszy rozmiar pliku i lepsza jakość.
-profile:v main
to jest profil H.264 do użycia. high jest najbardziej wydajnym pod względem rozmiaru pliku, ale wykorzystuje dużo procesora do dekodowania w porównaniu z innymi formatami, który jest najbardziej popularny, ponieważ większość telefonów komórkowych ma wbudowany dekoder sprzętowy i obsługuje go odtwarzacz flash, mój nie, więc muszę użyj main.
-tune fastdecode
mój telefon nie lubi odtwarzać plików bez tej opcji, ale zazwyczaj można to pozostawić puste lub ustawić na „film” w przypadku gier wideo, Głównym powodem, dla którego to używasz, jest uzyskanie trochę dodatkowej jakości.
I ostatnia rzecz, którą gorąco polecam używanie nowoczesnego formatu kontenera .avi nie jest zaprojektowany do przechowywania H.264 iz tego co rozumiem. nie ma standardu przechowywania H.264 lub tworzenia pliku większego niż 2 GB, większość implementacji to hacki i podatna na problemy, użyj mkv lub mp4.
Komentarze
- Ustawienia wstępne dla libx264 są teraz określone przez
-preset
jak w-preset slow
-
-tune fastdecode
wyłącza odblokowywanie i ważone ramki B i P, a także CABAC. Istnieją dekodery, które obsługują ramki B, ale nie CABAC? Proponuję-profile:v baseline
, jeśli chcesz kierować reklamy na stare dekodery sprzętowe. (fastdecode
może być przydatne, jeśli celujesz w oprogramowanie ponownie dekodować na wolnym procesorze, ale nie dekoder sprzętowy.) Główny z ramkami B, ale bez usuwania bloków lub CABAC może, ale nie musi, wyglądać lepiej niż linia bazowa z odblokowywaniem. +1 za polecenie not-AVI do przechowywania h.264. IIRC, główne to ramki B, ale tak, h.264 w avi nie jest dobrze ustandaryzowany i ' jest hacky. - I ' d wezwij
-crf 20
wysoki finał. Możesz zmienić to na 22, a nawet 24 i prawdopodobnie będzie dobrze, chyba że ' to szybki ruch, jak na imprezie sportowej.
Odpowiedź
Należy wyjaśnić kilka kwestii:
- Format to nie kodek; chcesz pobrać plik w formacie avi z wideo zakodowanym przy użyciu h264 kodek. Po prostu użyj -vcodec libx264 i nazwy pliku z .avi . Ffmpeg powinien rozpoznać format, patrząc na rozszerzenie pliku, ale możesz też być specyficzny, dodając -f avi . Na pewno nie chcesz używać mpeg1, ponieważ daje gorszą jakość niż mpeg2 lub nawet gorszą w porównaniu z mpeg4, co polecam.
- Twój problem polegał na tym, że ffmpeg po prostu używał najniższej możliwej jakości, ponieważ nie podałeś żadnej. Opcja -sameq rzadko wydaje się działać dla mnie. W rzeczywistości ręczne ustawienie szybkości transmisji jest bardzo przydatne. Dodaj na przykład -vb 3000k , aby uzyskać plik ze średnim bitrate video 3Mb / s, co daje całkiem dobrą jakość. Myślę, że to by wystarczyło dla Ciebie mieć 2 Mb / s dla wspomnianej rozdzielczości.
- Kluczem do zmniejszenia rozmiaru plików nie jest rozdzielczość, ale wspomniana powyżej szybkość transmisji. Wolałbym pozostać przy oryginalnej rozdzielczości i po prostu manipulować szybkością transmisji.
- Myślę, że chcesz również zachować dźwięk bez konwersji (a więc bez utraty jakości), więc użyj -acodec copy .
Spróbuj tego: ffmpeg -i highres.avi -acodec copy -vcodec libx264 -vb 2000k niższy res.avi
Komentarze
- Stała szybkość transmisji to najgorszy (pod względem jakości w stosunku do rozmiaru) ze wszystkich trybów kontroli szybkości w x264 i należy go unikać. Użyj
-crf
, aby zamiast tego ustawić tryb stałej jakości.