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.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *