Korzystam z następującego polecenia:
ffmpeg -i audio.mp3 -ar 44100 -f image2 -i logo.jpg -r 15 -b 1800 -s 640x480 foo.mov
Które z powodzeniem wyświetla wideo z moim nagranym dźwiękiem i obrazem na nim.
Podczas próby przesłania tego do YouTube nie można przetworzyć, niezależnie od formatów, które próbuję: .mov, .avi, .flv, .mp4
Czy w powyższym opisie brakuje jakiegoś ustawienia, które wygenerowałoby format akceptowany przez Youtube? Próbowałem przejrzeć dokumentację ffmpeg, ale jestem nad głową.
Zrobiłem eksperyment, umieszczając 2-sekundowe wideo z 30-sekundowym plikiem mp3. Po przesłaniu do youtube powstały film miał tylko 2 sekundy. Może być tak, że YouTube patrzy tylko na ścieżkę wideo na długość, a ponieważ zdjęcie ma tylko ramkę lub cokolwiek innego, być może to go rozwala.
Fragment kodu, który działa dla mnie z innego forum:
źródło
Wziąłem kod Pavla, który również dla mnie działał, i skróciłem go, przycinając niepotrzebne opcje:
jest to ogólna forma, która działa z dowolnym plikiem obrazu i audio jako wejściem i tworzy plik wideo jako wyjście.
To powiedziawszy, ponieważ ponieważ strumień wideo będzie składał się z jednego obrazu powtarzanego w nieskończoność, możesz ustawić niską liczbę klatek na sekundę (czyli liczbę obrazów, która pojawia się w ciągu sekundy) za pomocą
-r
. Należy pamiętać, że nie wszystkie pojemniki wyjściowe umożliwiają niskie liczby klatek na sekundę. Jednym z nich jestavi
, więc możesz zrobić:spowoduje to utworzenie pliku wideo z częstotliwością klatek 0,1 (tj. jeden obraz co 10 sekund) zamiast domyślnej 25. Wpłynie to na rozmiar pliku, ale nie na jakość wideo. W końcu możesz ustawić bitrate audio, aby uzyskać lepszą jakość dźwięku
-ab
. Oto polecenie, którego faktycznie używam do tworzenia tego rodzaju filmów na youtube:źródło
ffmpeg -loop 1 -shortest -r 0.1 -i audio.mp3 -i image.jpg output.avi
ale dostałem „Nie znaleziono pętli opcji”. Jakieś pomysły?ffmpeg -i <audio file> -loop 1 -i <image file> -shortest <output video file>
z avconv:
źródło
-shortest
opcji wyjściowych zamiast ręcznie deklarować czasy (użyj teżffmpeg
zamiast,avconv
jeśli to możliwe).Mam to do pracy po wielu eksperymentach: https://www.youtube.com/watch?v=qjlDT819Q3s
Konwertuj obrazy na wideo zgodnie z https://trac.ffmpeg.org/wiki/Create%20a%20video%20slideshow%20from%20images :
ffmpeg -framerate 1/20 -i png/img-%03d.png -c:v libx264 -vf "fps=25,format=yuv420p" png.mp4
Tutaj używam kilku zdjęć i zmieniam je co 20s.
Połącz wystarczającą liczbę kopii powyższego filmu, aby objąć czas trwania twojego dźwięku zgodnie z https://trac.ffmpeg.org/wiki/Concatenate . Inne rozwiązania, takie jak oczekiwanie, że
ffmpeg -i wav.wav -i png.mp4 youtube.mp4
zrobią coś dobrego, ostatecznie zostały odrzucone przez YouTube (również gracze tacy jak VLC są zdezorientowani i nie mogą właściwie szukać). Domyślam się, że pozycje czasowe muszą być korygowane w kopiach, coffmpeg
nie jest możliwe, chyba że zostaną połączone:ffmpeg -f concat -i pngs.txt -c copy pngs.mp4
(gdzie plik
pngs.txt
jest ręcznie robiony, aby zawierał tyle kopii, ile potrzeba: kopie = długość audio / długość wideo)Miksuj swoje audio z wideo uzyskanym w 2 zgodnie z https://www.virag.si/2015/06/encoding-videos-for-youtube-with-ffmpeg/ :
ffmpeg -i pngs.mp4 -i wav.wav -shortest -codec:v libx264 -crf 21 -bf 2 -flags +cgop -pix_fmt yuv420p -codec:a aac -strict -2 -b:a 384k -r:a 48000 -movflags faststart youtube.mp4
Teraz plik
youtube.mp4
powinien zostać zaakceptowany przez YT.źródło