FFMPEG konwertuj flv na mp4 bez utraty jakości [duplikat]

55

Obecnie konwertuję pliki flash .flv na .webm i .mp4 do użycia z odtwarzaczem wideo HTML5.

_

Używam tego polecenia ffmpeg dla WEBM: ffmpeg -i filename.flv -vcodec libvpx -acodec libvorbis filename.webm który działa świetnie, a rozmiar pliku pozostaje względnie taki sam (ważny).

_

W przypadku MP4 używam: ffmpeg -i filename.flv -sameq -ar 22050 filename.mp4

Konwertuje do formatu .mp4 fine i zapobiega utracie jakości, ale rozmiar pliku prawie trzykrotnie.

Jakiej formuły ffmpeg można użyć do konwersji na MP4 bez utraty zbyt wysokiej jakości i zapobiegania znacznie większemu rozmiarowi pliku?

Chad Whitaker
źródło

Odpowiedzi:

57
ffmpeg -i filename.flv -c:v libx264 -crf 19 -strict experimental filename.mp4

Musisz określić używany kodek wideo. W swoim poleceniu nie określisz -vcodecczy -c:vtak ffmpeg używa kodeka MP4 (domyślny mpeg4), które nie mają bardzo dobrą wydajność kompresji. Spróbuj zamiast tego użyć libx264 i ustawić CRF, czyli poziom jakości (im niższy, tym lepiej, domyślnie 23, a rozsądne wartości mieszczą się w przedziale od 18 do 28).

Kodowanie w libx264 jest dość skomplikowane, dlatego powinieneś zapoznać się z przewodnikiem kodowania H.264 .

Musisz także określić -strict experimentalinaczej: „Koder„ aac ”jest eksperymentalny, ale eksperymentalne kodeki nie są włączone, dodaj„ -strict -2 ”, jeśli chcesz go użyć.”

sashoalm
źródło
1
To zajmuje tyle czasu, a wynikowy mp4 jest bardzo zniekształcony, utracone piksele itp. Jakieś pomysły, dlaczego tak może być? : /
trainoasis,
Domyślny kodek wideo dla formatu MP4 niekoniecznie mpeg4. Zgodnie z danymi wyjściowymi ffmpeg --help muxer=mp4mojego komputera, ffmpeg używa h264 jako domyślnego kodeka wideo mp4.
doubleDown,
1
@doubleDown Moja odpowiedź jest stara - od 2011 roku. Prawdopodobnie od tego czasu zmienili domyślne.
sashoalm,
43

To polecenie zmienia tylko kontener bez ponownego kodowania

ffmpeg -i input.flv -codec copy output.mp4
c97
źródło
czy znasz sposób na wykonanie skryptu do konwersji wsadowej wielu filmów w tym samym folderze?
ttoine,
tak, w systemie Windows utwórz plik convert.bat i umieść w nim ten kod:, a for %%a in ("*.flv") do ffmpeg -i "%%a" -codec copy "%%~na.mp4"następnie uruchom plik convert.bat w folderze z plikami * .flv
c97
1
Dla mnie to rzuca Nie można napisać nagłówka dla pliku wyjściowego 0 (nieprawidłowe parametry kodeka?): Niepoprawny argument. Jakieś pomysły? : /
trainoasis,
2
@trainoasis twój .flv nie zawiera wideo H.264 i audio AAC. Kopiowanie nietkniętych danych audio / wideo -codec copydo pliku .mp4 działa tylko w bardzo rzadkim przypadku, gdy audio i wideo są już zakodowane w H.264 i AAC. Zobacz superuser.com/a/1009539/390946 i addpipe.com/blog/flv-to-mp4 .
Octavian Naicu,
3

avconvi ffmpegsą w gruncie rzeczy tym samym. [od BARDZO ostatnio istnieje SZEŚĆ rozbieżność, ale nie ma o czym pisać, jeśli skompilujesz własne ffmpeg[ten, na przykład w repozytoriach Ubuntu, jest STARY i cierpi z powodu tego rozmiaru wideo, nie jest bla bla bla bla [w zasadzie próbuje aby powiedzieć, że wideo ma niewłaściwe proporcje], ale jeśli masz ffmpegproblem z przeczytaniem przewodnika kompilacji i skompilowania go z git, nie ma żadnych problemów ze starszymi wersjami, które są dostępne w większości systemów operacyjnych. ostrzeżenie amortyzacja powołując się avconvmówi, że oni stworzyli nowszą util aby spróbować wymienić ffmpeg, ale to jest tak szeroko stosowane, że nawet gdyby próbowali odetnij ją, że wszyscy się tworząc softlinks od avconvdoffmpeg tak czy inaczej, żeby nie przestali pracować i nie upuścili go.]]

Nie jest to nic złego w użyciu avconv, właśnie widziałem jedną odpowiedź, w której wspomniano o ostrzeżeniu o amortyzacji, które jest w zasadzie pustą wiadomością, raczej dla alternatywy dla ffpmeg, którą możesz wypróbować avconv, która jest bardziej prawdziwa w tym przypadku.

avconv -i inputfile.flv -map 0 -c:v libx264 -c:a copy outputfile.mp4

jest tak samo SAMY jak

ffmpeg -i filename.flv -vcodec libvpx -acodec libvorbis

Zasadniczo w pierwszym przypadku korzystasz z opcji dla osób o mniejszej liczbie osób, a w drugim - bardziej wypisanej.

RÓWNIEŻ -map 0odnosi się do ścieżek audio, więc jeśli używasz czegoś takiego, mp4aktóry może obsługiwać wiele ścieżek audio w porządku, możesz to wyłączyć, aby skopiować wszystkie strumienie audio do pliku wynikowego. Jest to wymagane tylko wtedy, gdy używasz kodeka, który nie obsługuje wielu ścieżek audio w tym samym pliku, to chcesz zmapować potrzebny dźwięk i nie wszystkie. Oczywiście, jeśli próbujesz zminimalizować zużycie miejsca, możesz podać tylko jedną, która spróbuje powalić plik na odrobinę rozmiaru [dźwięk jest jak 1/3 wielkości ścieżki wideo [i to jest hojne]].

-c:v = codec(video)więc: -c:v libx264jest taki sam jak przy użyciu: -vcodec libx264FYI; to samo z tym przykładem:-c:v copy = -vcodec copy

a ponadto w przypadku plików FLV należy zachować ostrożność, ponieważ plik flv jest taki sam jak plik avi, ponieważ jest pojemnikiem, który może zawierać dowolną liczbę kodeków dla obrazu lub dźwięku. Najpierw chciałbyś użyć wybranego narzędzia do inspekcji mediów, aby zobaczyć, co jest używane w samym pliku, zanim zdecydujesz się po prostu skopiować strumień wideo i / lub audio lub jeśli chcesz przenieść go z czegokolwiek do nowego. Tak więc polecenie, które działa najlepiej dla jednego pliku FLV, może nie być takie samo dla innego pliku FLV [oczywiście ZWYKLE jeśli otrzymujesz wiele plików FLV z tego samego źródła, zostaną one zakodowane w ten sam sposób, ale nigdy nie jest to gwarancją].

Nie próbując podrywać, po prostu natknąłem się na to podczas wyszukiwania w Internecie i chciałem spróbować trochę wyjaśnić ludziom.

Ponownie, ponieważ odpowiedź brzmi dla odpowiedzi poniżej tego TAK, działający ffmpeg zawsze opublikuje tę wiadomość, jest ona zasadniczo pusta, ponieważ te 2 narzędzia są nadal takie same, z niewielką różnicą. Prawie we wszystkich przypadkach powinieneś uzyskać dokładnie takie same wyniki za pomocą dowolnego polecenia. To niekoniecznie spowoduje pełne ponowne transkodowanie, dlaczego? A, jeśli nie jest potrzebny, oszczędza mnóstwo czasu, a B, jeśli ponownie transkodujesz plik, który został już skompresowany do kodeka wideo, zasadniczo uruchamiasz procedurę kompresji w stosunku do czegoś, co jest już skompresowane i zawsze spowoduje w gorszej jakości niż źródło. Większość nowszych kodeków jest w pewnym stopniu kompatybilna krzyżowo [nie wszystkie], na przykład flv może technicznie być MP4 w opakowaniu FLV, ponieważ pliki FLV, takie jak AVI, są tylko kontenerami innych kodeków. Więc, zależy to od tego, co źródłowy plik flv ma dla wideo i kodeka ausio w porównaniu z tym, na co go konwertujesz, czy w ogóle należy go transkodować. Jeśli w FLV użyli wideo H264 MP4 i MP4a dla dźwięku, nie trzeba będzie ponownie transkodować tego, co trzeba tylko skopiować i wyregulować nagłówki plików, aby było czytane jako prawdziwe MP4 zamiast wideo MP4 wewnątrz pliku FLV.

Parias
źródło
3

Zgodnie z tym przewodnikiem właściwym poleceniem konwersji FLV na MP4 bez jakiegokolwiek przekodowywania AV jest:

ffmpeg -i input.flv -c copy -copyts output.mp4

Działa idealnie dla mnie we wszystkich przypadkach z wideo AVC i audio AAC lub MP3.

Al Kepp
źródło
-1

Podczas korzystania z ffmpeg dostałem ostrzeżenie o wycofaniu, aby użyć avconv. Korzystając z avconv uzyskałem dobre wyniki:

avconv -i inputfile.flv -map 0 -c: v libx264 -c: kopia plik wyjściowy.mp4

Przeczytaj, man avconvaby uzyskać więcej informacji.

gare_c
źródło
1
ffmpegsamo nie jest przestarzałe . Powodem, dla którego wygląda dobrze, jest to, że określasz koder x264, który ma ładne domyślne ustawienia jakości.
slhck
-2

Sugeruję utworzenie skryptu powłoki dla tego wywołanego video_flv_to_mp4z następującą zawartością:

ffmpeg -i $1 -sameq -ar 22050 -vcodec libx264 $1.mp4 

Następnie uruchom go w następujący sposób:

$ video_flv_to_mp4 video.flv

Otrzymasz plik video.flv.mp4.

Thibault
źródło
4
-sameqnie jest już prawidłową opcją dla ffmpeg. Nie oznacza to również „tej samej jakości”. Zobacz także ten post .
slhck