Jag är komplett med videobearbetning, så förlåt mig om jag ber om något löjligt.
Jag får videoklipp från en digitalbox. Klippen är AVI-filer:
Resolution: 1920 x 1080 Frames Per Second: 60 Video Format: ITU H.264 Audio Format: MPEG 1 Audio, Layer 3 (MP3)
Upplösningen och FPS är långt bortom vad jag behöver, så jag försöker köra ett kommando för att skala ner saker:
ffmpeg -i highres.avi -r 30 -s 960x540 lowerres.avi
Detta lyckades ge mig önskad upplösning, framerate och lägre filstorlek, men det försämrade också kvaliteten mer än jag förväntade mig.
Jag tittade på den nya filen och fann att FFmpeg av någon anledning konverterade det använda formatet:
Video Format: FFmpeg MPEG-4 Audio Format: MPEG 1 Audio, Layer 2
Det är oklart för mig varför det skulle inte använda samma utdataformat som inmatningsformat. Jag försökte använda detta kommando för att tvinga det att använda H.264:
ffmpeg -i highres.avi -r 30 -s 960x540 -f h264 lowerresforceh264.avi
Tyvärr misslyckades det med följande utdata:
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
Jag är inte säker på varför jag inte kan göra det. Kör ”ffmpeg -formats” listade h264 som en den kunde använda för både input och output.
Om någon skulle kunna peka mig i rätt riktning, skulle jag uppskatta det mycket. Tack.
PS: Jag använder FFmpeg version 0.7.3-4: 0.7.3-0 på Ubuntu 11.10.
EDIT
Jag har hittade en lösning som tittar på användningen av förinställningar. Efter att ha letat efter information om förinställningar hittade jag följande handledning som diskuterade dem:
http://juliensimon.blogspot.com/2009/01/howto-ffmpeg-x264-presets.html
Jag behövde bara ange codec och rätt förinställd inställning så här:
ffmpeg -i highres.avi -r 30 -s 960x540 -vcodec libx264 -vpre medium lowerresforceh264vpremedium.avi
Jag har fortfarande en del justeringar att göra, men det här är i princip vad jag ville ha. Tack.
Kommentarer
- Visst vill vissa bara veta hur man konverterar Avermedia .avi-filer .mp4 så att de spelar på Mountain Lion / Mavericks < pre > ffmpeg -i 140203-1229.avi -vcodec kopia -acodec kopia fromavermedia_cog.mp4 < / pre >
Svar
I ” Jag försöker hjälpa. Först förstår jag inte varför du säger att FFMPEG H.264 inte är ingångsformatet?
Jag vet inte kommandoraden FFMPEG tillräckligt bra (finns det någon som gör?;)). Det måste finnas en omkopplare för multipasskodning. Jag vet att det finns några inbyggda förinställningar som du förmodligen kan använda och gör nästan säkert vad du siktar på. Dessa kallas normalt x264 förinställningar eller x264 tune. Kan du hitta något liknande?
Kommentarer
- Tack. Ditt samtal om förinställningar har hjälpt mig att hitta en sannolik lösning. Jag ’ Redigerar inlägget för att visa vad jag gjorde.
- Trevlig lösning. Har lagts till i min samling av utdrag. Tack.
- @ BigBeagle: När du hittar ett svar på din fråga kan du lägga upp det som ett svar. Redigering av din fråga görs för att ge mer klarhet i frågan. Som jag förstår går svaren i svaret.
Svar
ffmpeg har tagit bort sina x264 förinställningar så att -vpre-inställningen fungerar inte längre.
Nu har jag ett skript för att konvertera videofiler till ett format som min mobiltelefon klarar.
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
Jag kommer att förklara varje alternativ
-sws_flags lanczos+accurate_rnd
det här alternativet är nedskalningsalgoritmen, lanszos rekommenderas eftersom det ger minst artefakter utan att blurra men det är långsam.
-vf "scale=..."
är självförklarande ange utdataupplösningen
-crf 20
detta är kvalitet, 20 är en bra final (använd inte den innan du redigerar) output-inställningen, detta är konstant kvalitet och är det bästa alternativet när filstorleken inte är tät och ger bättre kvalitet vid lägsta filstorlek än någonting annat, annars använd två pass för maximal kvalitet vid en viss filstorlek (som att behöva montera den på en CD eller DVD), fast bithastighet (t.ex. ) bör endast användas vid streaming, ett specialfall är” 0 ”vilket är förlustfritt och intervallet för detta alternativ är från 1 (högsta kvalitet) till 50 (lägsta kvalitet).
Ett bra test för detta är att köra genom koden med -crf 20 notera bithastigheten, och använd sedan det som -b-inställningen för en andra version av filen båda ska ha samma filstorlek, jämför de två för kvalitetsskillnader.
-preset veryslow
detta väljer hur mycket processor du vill använda, desto långsammare ju mindre filstorlek och bättre kvalitet.
-profile:v main
det här är H.264-profilen att använda. hög är den mest effektiva filstorleken men använder mycket CPU för att avkoda jämfört med andra format, som sagt är det mest populära eftersom de flesta mobiltelefoner har en inbyggd hårdvarudekoder och flash-spelare stöder det, min gör inte så jag måste använd huvud.
-tune fastdecode
min mobiltelefon gillar inte att spela filerna utan det här alternativet, men vanligtvis kan detta lämnas tomt eller ställas in på ”film” för videospel, Huvudskälet till att du använder detta är att få lite extra kvalitet.
Och det sista jag rekommenderar starkt att du använder ett modernt containerformat .avi är inte utformat för att hålla H.264 och enligt vad jag förstår där ” s ingen standard för att lagra H.264 eller göra filen större än 2 GB, de flesta implementeringar är hack och benägna att ha problem, använd mkv eller mp4.
Kommentarer
- Förinställningarna för libx264 specificeras nu av
-preset
som i-preset slow
-
-tune fastdecode
inaktiverar avblockering och viktade B- och P-ramar samt CABAC. Det finns avkodare som kan hantera B-ramar, men inte CABAC? Jag föreslår-profile:v baseline
, om du behöver rikta in dig på gamla hårdvarudekodare. (fastdecode
kan vara användbart om du riktar in en softwa re avkodare på en långsam CPU, men inte en hårdvaruavkodare.) Huvud med B-ramar men ingen avblockering eller CABAC kan eller kanske inte ser bättre ut än baslinjen med avblockering. +1 för att rekommendera inte-AVI för lagring av h.264. IIRC, det huvudsakliga är B-ramar, men ja h.264 i avi är inte väl standardiserat, och det ’ s hacky. - I ’ d kallar
-crf 20
en hög final. Du kan ändra det till 22 eller till och med 24 och förmodligen ha det bra, såvida det inte är ’, som ett sportevenemang.
Svar
Det finns några saker att göra tydliga:
- Ett format är inte en codec; du vill hämta en fil i avi format med video kodad med h264 codec. Använd bara -vcodec libx264 och ett filnamn med .avi . Ffmpeg bör känna igen ett format genom att titta på ett filtillägg, men du kan också vara specifikt att lägga till -f avi . Du vill definitivt inte använda mpeg1, eftersom det ger sämre kvalitet än mpeg2 eller ännu värre jämfört med mpeg4, vilket jag rekommenderar.
- Ditt problem var att ffmpeg bara använde lägsta möjliga kvalitet eftersom du inte angav någon. Alternativet -sameq verkar sällan fungera för mig. Det är faktiskt mycket handfull att ställa in bithastigheten manuellt. Lägg till till exempel -vb 3000k för att få en fil med en genomsnittlig video bithastighet på 3Mb / s, vilket ger ganska bra kvalitet. Jag antar att det skulle vara tillräckligt för dig att ha 2Mb / s för den nämnda upplösningen.
- Nyckeln för att sänka filstorleken är inte upplösning, utan bithastighet som nämns ovan. Jag skulle hellre hålla mig till originalupplösningen och bara manipulera bithastigheten. li> Jag antar att du också vill behålla ljudet utan konvertering (så utan kvalitetsförlust), så använd -acodec-kopia .
Prova detta: ffmpeg -i highres.avi -acodec kopia -vcodec libx264 -vb 2000k lägre res.avi
Kommentarer
- Konstant bithastighet är den värsta (när det gäller kvalitet kontra storlek) för alla hastighetskontrolllägen i x264 och bör undvikas. Använd
-crf
för att ställa in ett konstant kvalitetsläge istället.