To powinno być dość trywialne, ale nie mogę znaleźć sposobu, aby uruchomić go.
Chcę, aby FFmpeg wziął jeden obraz JPEG i plik audio jako dane wejściowe i wygenerował plik wideo o tym samym czasie trwania co plik audio (poprzez rozciągnięcie obrazu nieruchomego na cały czas).
Nie dbam zbytnio o to, jaki kodek wideo jest używany do wyjścia, ale bardzo ważne jest, aby móc użyć „kopiowania” jako kodeka audio (tj. Skopiować strumień audio bez transkodowania).
Jaka byłaby odpowiednia linia poleceń?
Próbowałem:
ffmpeg -i image8.jpg -i sound11.amr -acodec copy test.avi
i próbowałem wiele kombinacji i bez -s 640x360
, -loop_input
, -shortest
, -t xxx
, -r 0.1
(sztucznie niski wskaźnik ramki w nadziei, że film byłby dłuższy) i-f image2
Albo dostaję błędy, albo dostanę plik wideo o czasie trwania jednej klatki.
Przeszukałem go i znalazłem kilkanaście proponowanych rozwiązań (podobno tego samego pytania), z których żadne nie działa.
Czy ktoś może zasugerować działające polecenie i wyjaśnić uzasadnienie?
ffmpeg -y -i image.png -i audio.mp3 -c:a copy result.avi
Odpowiedzi:
Kolejność opcji w wierszu poleceń ma znaczenie. Następujące działa w moim przypadku:
W bardziej ogólnym przypadku, gdzie
image.jpg
i jakieaudio.wav
są twoje dane wejściowe, możesz użyć następującej komendy, zaadaptowanej z wiki FFmpeg :libx264
Użyłoby to kodera i zapewniłoby lepszą kompresję niż kodek MJPEG użyty powyżej. Audio to AAC, z wbudowanymffmpeg
koderem AAC.źródło
Option shortest (finish encoding within shortest input) cannot be applied to input file image.jpg -- you are trying to apply an input option to an output file or vice versa. Move this option before the file it belongs to.
ffmpeg -y -i image.png -i audio.mp3 -c:a copy result.avi
tego działa lepiej !!!?! ??!?!Robisz to sposób trudniejsze niż to musi być. FFmpeg jest o wiele mądrzejszy, niż ci się wydaje - wie, że chcesz, aby wideo miało taką samą długość jak ścieżka dźwiękowa.
Jedynymi atrybutami Państwo mają określić to
input filenames
,output codecs
ioutput filename
(co eo ipso obejmujeoutput container
,).Oczywiście sensowne jest rozpoczęcie od nieruchomego obrazu, który ma takie same wymiary jak twój ostateczny film; jeśli używasz dedykowanego edytora obrazów zamiast określania wymiarów wyjściowych do spełnienia przez FFmpeg, musisz upewnić się, że wymiary wejściowe są liczbami parzystymi .
Rozmiar wyjściowy jest jednym z najczęstszych zawieszeń FFmpeg; niektóre kodeki są bardziej ograniczone w wymiarach wyjściowych niż inne, ale żadne dane wyjściowe nie mogą mieć atrybutów wysokości lub szerokości o nieparzystej liczbie.
pause
Polecenia na końcu pliku wsadowym utrzymuje otwarty CLI - w najlepszym sposobem na debugowanie wiersza poleceń jest czytanie komunikatów o błędach generuje. Są bardzo szczegółowe - i najlepsza dokumentacja, jaką posiada FFmpeg - ale ciężka praca deweloperów jest marnowana, jeśli pozwolisz zamknąć okno, zanim będziesz mógł je odczytać.Powłoka poleceń ma przełącznik,
cmd /k
który utrzymuje otwarte okno, w którym można uruchomić te same instrukcje ze skryptu wsadowego w wierszu polecenia.Zarówno FFmpeg, jak i avconv sprawią, że będziesz używać
-c:a
dla-acodec
i-c:v
dla-vcodec
, ale stare instrukcje działają dobrze w kompilacjach, których używam.Nota Bene: Każde zatwierdzenie ma osobliwości. Jeśli Twój wiersz poleceń zawiedzie bez wyraźnego powodu, często pomocne jest wypróbowanie innej wersji - lub skorzystaj z opcji przejścia do libav , gdzie najbardziej aktywni programiści FFmpeg byli od kilku ostatnich lat. Ich narzędzie do transkodowania zostało przemianowane na avconv, ale pliki wsadowe powinny działać z jednym z nich.
źródło
Mine is a win-64 ffmpeg build compiled on: Jan 6 2013, at: 16:16:53
Ani twoje rozwiązanie, ani rozwiązanie @matteo nie działało dla mnie. Pobrałem też twoje pliki z Dysku Google, ale nie dało to oczekiwanego wyniku (plik wyjściowy był czarny, zawierał tylko dźwięk). Pomóż mi w znalezieniu właściwego polecenia, które ma być użyte.Jeszcze łatwiej:
ffmpeg -i ep1.png -i ep1.wav ep1.flv
FFmpeg spróbuje automatycznie wybrać najlepszy kodek, w zależności od rozszerzenia pliku wyjściowego.
Aktualizacja: Zauważyłem, że YouTube ma trudności z przetwarzaniem wideo (utknie na poziomie 95%) Myślę, że ponieważ jest tylko jedna klatka. Rozwiązanie, które znalazłem, by uszczęśliwić YouTube: dodaj więcej ramek. Dodałem również,
-acodec copy
aby zachować jakość dźwięku. Potrzebujesz-shortest
albo zapętla się na zawsze. (Zatrzymuje się na końcu najkrótszego strumienia, jakim jest dźwięk, ponieważ pętla obrazu jest nieskończona.) Kolejność opcji jest bardzo ważna dla szybkości, ponieważ filtry (i takie) są przetwarzane w określonej kolejności. Jeśli zmienisz kolejność tych parametrów, wyniki będą się znacznie różnić.ffmpeg -r 1 -loop 1 -i ep1.jpg -i ep1.wav -acodec copy -r 1 -shortest -vf scale=1280:720 ep1.flv
Zauważ też, że ustawiam dwa razy częstotliwość klatek, to nie jest przypadek - pierwsza częstotliwość jest dla danych wejściowych, druga dla danych wyjściowych. Jeśli zrobisz to poprawnie, powinna być tylko jedna klatka wideo na sekundę, co oznacza, że koduje się stosunkowo szybko. Ustawiłem też tutaj rozdzielczość na 720p, co oznacza, że powinieneś uzyskać dźwięk HD na YouTube :-)
źródło
No pixel format specified, yuvj420p for H.264 encoding chosen. Use -pix_fmt yuv420p for compatibility with outdated media players. [libx264 @ 0x2b5c940] height not divisible by 2 (700x457)
... to działa:ffmpeg -r 1 -loop 1 -i ep1.jpg -i ep1.wav -acodec copy -r 1 -shortest -vf scale=1280:-2 video.mp4
Wersja, która działała dla mnie:
Kasa opcja
-shortest
musi znajdować się przed plikiem wyjściowym, jeśli nie, pojawia się następujący błąd:Opcja najkrótsza (zakończenie kodowania w ramach najkrótszego wejścia) nie może być zastosowana do pliku wejściowego pic.jpg - próbujesz zastosować opcję wprowadzania do pliku wyjściowego lub odwrotnie. Przenieś tę opcję przed plik, do którego należy. Błąd podczas analizowania opcji pliku wejściowego pic.jpg.
źródło
Z strony podręcznika ffmpeg:
Jak odkryłeś, opcje infiltracji muszą znajdować się przed infilem, którego dotyczą.
Nie jest to jednak błąd, tylko mechanizm, za pomocą którego można określić, które argumenty infile mają zastosowanie.
źródło
To zadziałało dla mnie
Odkryłem, że vcodec
libx264
utworzył znacznie mniejsze pliki niżmpjeg
(10 MB zamiast 100 MB).źródło
-shortest
jest opcją wyjściową i może być ignorowana jako opcja wejściowa podczas jej używania.Próbowałem zrobić jako @matteo , ale bez dźwięku, a rozwiązanie @Colonel Panic działało najlepiej:
Musiałem tylko dodać argument czasu trwania w sekundach (
-t 10
).źródło
-shortest
jest opcją wyjściową, ale używasz jej jako opcji wejściowej. Przenieś go przed plikiem wyjściowym i możesz go wyeliminować-t 10
, ale wtedy twoja odpowiedź będzie prawie taka sama jak inne.ffmpeg -loop 1 -i img.jpg -i audio.wav -c:v libx264 -c:a aac -strict experimental -b:a 192k -shortest out.mp4
źródło
Jeśli ktoś chce je przekonwertować, spróbuj tego.
Możesz ustawić folder wejściowy i wyjściowy, a także format, w jakim chcesz wideo. W tym przypadku ustawię go na AVI.
Ta odpowiedź Połącz jeden obraz + jeden plik audio, aby zrobić jedno wideo za pomocą FFmpeg, bardzo mi pomogła.
źródło
Wypróbuj to polecenie. To działa dla mnie.
źródło