Jak zmienić mp3 w film dla YouTube?

Jako że ostatnio podjąłem decyzję o publikowaniu "Gadania Gadesa" także na platformie YouTube, musiałem zmierzyć się z pewnym problemem. Mimo zapowiedzi (które ciągną się od kilku miesięcy już), YouTube nadal nie umożliwia łatwego publikowania audio ze statycznym obrazem. Ba, w ogóle nie da się wrzucić do niego pliku audio, zawsze musi być to plik wideo. Niektóre platformy podcastowe (zdaje się, że np. https://www.spreaker.com na taką możliwość) mogą automatycznie wrzucać podcasty w odpowiedniej formie na YouTube'a, jednak często wiąże się to z faktem umieszczenia na wyświetlanym tle reklamy czy nazwy serwisu.

Z drugiej strony, kiedy wyobraziłem sobie, że każdy odcinek podcastu będę musiał wrzucać do DaVinci, dopasowywać grafikę, renderować, a potem jeszcze przesyłać wielki plik wideo, to odchodziła mnie ochota na tego typu zabawę. To był w zasadzie główny powód, dla którego "Gadanie Gadesa" trzymało się od YouTube'a z daleka - drugim była moja niewiara, że ktokolwiek faktycznie w ten sposób słucha podcastów (a jednak!)

FFMPEG

Z pomocą do szybkiej konwersji pliku dźwiękowego na wideo przychodzi nam popularny program ffmpeg.exe, który jest często instalowany przez np. odtwarzacze wideo czy oprogramowanie audio. W zasadzie większość dzisiejszego wpisu będzie właśnie o tym, jak zdobyć wspomniany plik, żeby móc go użyć do konwersji, bowiem - niestety! - nie jest to tylko kwestia pobrania odpowiedniego linku. Będę się posługiwał przykładami z Windows, bo właśnie tego systemu operacyjnego używam, ale omawiane programy są dostępne także dla Linuksa i MacOSa, więc całą procedurę da się zrobić w dowolnym z tych systemów.

Po pierwsze, należy wejść na stronę https://www.7-zip.org/download.html i pobrać stamtąd 7zip-a, czyli program kompresujący i dekompresujący archiwa, będzie potrzebny do rozpakowania archiwum z ffmpeg.exe. W moim przypadku była to wersja instalacyjna dla Windows:

Instalujemy go szybko:

i możemy przejść na stronę https://www.gyan.dev/:

skąd pobieramy albo plik ffmpeg-git-essentials.7z, albo ffmpeg-git-full.7z - wystarcza essentials.

Teraz trzeba pobrane archiwum .7z rozpakować, czyli odszukujemy je w katalogu, gdzie zostało zapisane przez przeglądarkę i klikamy na nim prawym przyciskiem myszy, wybierając polecenie rozpakowania do katalogu o nazwie identycznej z nazwą pliku .7z:

Na dysku pojawi się nam katalog z nazwą identyczną z pobranym plikiem - wejdźmy do niego, a znajdziemy coś takiego:

Uf, i to już koniec przygód - w podkatalogu bin znajduje się bowiem pożądany przez nas plik ffmpeg.exe. Jeśli nie chcemy używać skomplikowanej ścieżki, która obecnie do niego prowadzi, możemy skopiować go na jakiś inny dysk czy do innego, krótszego w nazwie katalogu.

Co dalej?

Skoro mamy już ffmpeg.exe, mamy plik .mp3 z odcinkiem podcastu, który chcemy zamienić na filmik dla YouTube'a, trzeba przygotować jeszcze grafikę, która będzie wyświetlała się podczas odtwarzania - ja wykonałem sobie planszę o rozdzielczości FullHD, czyli 1920x1080 pikseli:

No i czas na najważniejszą rzecz - konwersji dokonuje się dość skomplikowaną komendą w linii poleceń. Otwórzmy ją zatem, naciskając Win+R i wpisując cmd:

- po zatwierdzeniu klawiszem Enter otworzy się linia poleceń:

Teraz musimy wpisać polecenie, zamieniając - rzecz jasna - nazwy katalogów i plików tak, by pasowały do naszej konkretnej sytuacji:

j:/download/ffmpeg.exe -loop 1 -framerate 2 -i f:\gadaniegadesa_normal_yt.png -i f:\podcast_071_portacapture_x8.mp3 -c:v libx264 -preset medium -tune stillimage -c:a copy -shortest -pix_fmt yuv420p f:\071_podcast.mp4

Ważne, żeby użyć pełnych ścieżek do poszczególnych plików - dlatego czasem warto skopiować je wcześniej wszystkie do jednego katalogu wraz z plikiem ffmpeg.exe i uruchomić linię poleceń właśnie w tym katalogu - wtedy ścieżki w poleceniu będzie można pominąć. Nazwy plików w powyższej komendzie to - w kolejności występowania - ścieżka do pliku ffmpeg.exe, ścieżka do pliku z grafiką, ścieżka do pliku z dźwiękiem oraz ścieżka docelowego filmu w formacie mp4.

Po zatwierdzeniu polecenia program ffmpeg.exe powinien przystąpić do pracy, jeśli nie zrobiliśmy jakiegoś błędu w poleceniu (często zdarza się skasować któryś z minusów):

Trwa to jakiś czas, ale koniec końców zobaczymy ekran podobny do tego:

I w miejscu docelowym pojawi się plik mp4, który można już normalnie odtworzyć:

Jeśli plik się odtwarza, ma dźwięk i obraz, można wrzucić go do serwisu YouTube i cieszyć się życiem :)

Parametry

Jeśli ktoś jest ciekaw, to na szybko omówię parametry programu ffmpeg.exe. Pierwsze z nich (czyli -loop 1 -framerate 2) dbają o to, by plik wideo po utworzeniu zawsze miał co wyświetlać, inaczej nasza grafika byłaby tylko pierwszą klatką w filmie i potem byłoby po prostu czarno - zaś YouTube wyjątkowo nie lubi filmików z pojedynczą klatką obrazu i po prostu nie pozwoliłby nam wczytać takiego wideo.

Później podajemy pliki wejściowe parameterem -i i pełną nazwą pliku - obraz i dźwięk. Następnie napotykamy parametry związane z kodowaniem wideo: kodek (-c:v libx264), optymalizację szybkości kodowania (-preset medium) oraz optymalizację kodeka, któremu podpowiadamy, że wideo będzie wyświetlało ciągle to samo (-tune stillimage).

Parametr -c:a copy z kolei powoduje, że do filmiku warstwa audio zostanie po prostu skopiowana, bez ponownego kompresowania czy zmiany - to ważne, bo już sam plik mp3 jest skompresowany i jego ponowne rozkompresowanie i skompresowanie spowodowałoby niepotrzebny spadek jakości. Jeśli jednak stosujemy plik wav zamiast mp3, możemy wypróbować zamiast -c:a copy zastosować kompresję AAC: -c:a aac -b:a 320k - inaczej plik wideo będzie nie mniejszy niż plik audio, a godzinny nieskompresowany wav w formacie stereo potrafi zająć kilkaset megabajtów. Wszystko zatem będzie zależało od tego, na czym najbardziej nam zależy.

Na koniec jeszcze pozostaje przełącznik -shortest, dzięki któremu ffmpeg.exe kończy przetwarzanie od razu po osiągnięciu końca pliku wynikowego. Parametr -pix_fmt yuv420p steruje formatem piksela dla kodeka x264 - można wypróbować inne wartości, np. yuv444p, ale wydaje mi się, że wystarczający jest właśnie yuv420p.

Osoby ciekawe innych opcji programu ffmpeg.exe, zapraszam do dokumentacji, skąd możecie się dowiedzieć, jak np. nałożyć na obraz tekst (np. z aktualnym tytułem odcinka, żeby nie musieć przygotowywać każdej okładki osobno). Przykładowo, poniższe polecenie z dodaną konfiguracją filtra (pogrubienie):

j:\download\ffmpeg.exe -loop 1 -framerate 2 -i f:\gadaniegadesa_normal_yt.png -i f:\podcast_071_portacapture_x8.mp3 -c:v libx264 -preset medium -tune stillimage -vf "drawtext=fontfile=/Windows/Fonts/GARAIT.TTF:text='Przykładowy tytuł':fontcolor=white:fontsize=46:x=(w-text_w)/2:y=(h-text_h)/2" -c:a copy -shortest -pix_fmt yuv420p f:\071_podcast.mp4

spowoduje nałożenie na obrazek białego tekstu "Przykładowy tytuł" pisanego fontem Garamond Italic (na co wskazuje ścieżka /Windows/Fonts/GARAIT.TTF) dokładnie na środku (choć można użyć współrzędnych x i y do precyzyjnego wskazania innego położenia - tutaj jest ono wyliczane na podstawie wielkości obszaru tekstowego). Kadr wygląda po takiej konwersji następująco:

Rzecz jasna, zastosowany font musi być zainstalowany w naszym systemie, w katalogu /Windows/Fonts.

Na koniec

Powyższy sposób jest nieco żmudny, jednak po przetestowaniu działania każda kolejna konwersja staje się banalna - linię poleceń można zapisać sobie do pliku bat, zastosować jakieś stałe nazwy plików, po czym wrzucać do wybranego katalogu najnowszy odcinek podcastu z taką właśnie "standardową" nazwą, uruchamiać plik bat i już po chwili mamy gotowy plik mp4. Można także wypróbować którąś z nakładek graficznych na program ffmpeg.exe.

Jeśli ktoś ma do przerobienia cały katalog plików dźwiękowych na youtube'owe wideo, da się tak również zrobić, ale tu już odsyłam do wyszukiwarki - trzeba stworzyć odpowiedni plik bat, wywołujący program ffmpeg.exe w pętli dla każdego znalezionego pliku audio. Ale da się, zapewniam, a to może oznaczać dużą oszczędność czasu.

Komentarze