ffmpeg _ _ MP3 + PNG `= MP4 _ _ hogyan

 ( mzperix | 2019. október 12., szombat - 10:46 )

Korábbi témán elindulva
azon gondolkodtam, ha már ezer meg egy dologra jó az ffmpeg
terminálos átdolgozás akkor milyen paranccsal lehetne megoldani a következőt.:

Adott egy MP3 és egy JPG vagy PNG kép (mondjuk 1280x720 felbontásban), szóval ezt hogyan lehetne egybegyúrni egy rövid paranccsal, ezzel elkerülni hogy külön video editor programokban kelljen szerkesztgetni.
Nyilván a kép az egész hangfájl hosszáig jelen lenne és a kimeneti fájl mondjuk egy MP4 lenne.

Melyik parancs lenne ide a leginkább ideális?

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

ffmpeg \
  -loop 1 -f image2 -i teszt.png \
  -f mp3 -i teszt.mp3 \
  -shortest \
  -vcodec libx264 -vb 1500000 -r 25 \
  -acodec aac -ab 160000 \
  -f mp4 teszt.mp4

Én is így csináltam anno, amikor egyik ismerősnek kellett a YouTube-ra zenés videó. Egy-két megjegyzés azért. Az mp4 konténer tud közvetlenül mp3-at (mp2, „mp1”-et is), így azt nem kell átkonvertálni aac-be, mehet -acodec copy paraméterekellel. A másik, hogy az x264 kódeknek a bitrátáját állóképnél le lehet venni 100000-300000 környékére, az 1500000 overkill. Ezzel persze vigyázni kell, mert szabvány szerint a H264 lemehet 160 bit per frame-re, de egyes lejátszóknál viszont kiverheti a biztosítékot a túl alacsony bitráta, így kísérletezni kell, és nem szabad túlzásba vinni.


“I didn’t start using Linux so I could have friends.” (Luke Smith, 2019) 🐧

Az általam használt hardveres dekóder így tudja lejátszani, mp3 kodekkel és alacsonyabb bitrate-tel/profillal nem.

Egyenként kell próbálni. mp3 kódek, de magasabb bitrátás x264, és fordítva, úgy fog csak kiderülni, hogy a kettő közül melyik nem tetszik neki. De tényleg elképzelhető, hogy a hardveres dekóder válogat, mivel nem a teljes szabványt implementálták bele. Ugyanis szabvány alapján megengedett az mp4 konténerben az mp3 kódek, ha a dekóder nem támogatja, az annak a hibája, nem a szabványé meg az audiósávé.

Sőt, annyiból duplán furcsa, hogy a hardveres dekódolónak nem kéne, hogy az audiókódek számítson, csak a videót kéne dekódolnia.

De ha annyira csak aac-t vesz be, akkor az mp3 transzkódolása helyett szerezd be a hangsávot losslessben (flac, wav) és az Apple-féle qaac 2.68-cal tömörítsd be min. 192 kbsp-os bitrátával. Így biztosan nem szenved túl nagy csorbát a hangminőség.


“I didn’t start using Linux so I could have friends.” (Luke Smith, 2019) 🐧

az mp3 codec az meg okes, de az alacsonyabb bitrata / profil mar marhasag, mert szabvany szerint visszafele kompatibilitas van.
Hacsaknem valami rettentoen nagyon elbaszott dzsunka dekoder van a lejatszonal

Pedig valószínű az a helyzet, hogy dzsunka a dekóder a lejátszóban, nem implementálták bele rendesen a szabványt. Azért is írtam mindjárt, hogy elvileg, szabvány szerint van az, amit írtam, és a valóságban a hardveres dekódorek ehhez képest válogathatnak.


“I didn’t start using Linux so I could have friends.” (Luke Smith, 2019) 🐧

Nem a pontos kérdésre válaszolva, itt egy parancssori eszköz, amivel mp3-ba tudsz ID3v2.3 borító képet rakni:

eyeD3 --add-image cover.png:FRONT_COVER

https://eyed3.readthedocs.io/en/latest/cli.html
https://eyed3.readthedocs.io/en/latest/plugins/classic_plugin.html

Az mp3-ba fordított borítóképet a jó video lejátszók ugyanúgy megjelenítik lejátszáskor mintha video lenne.

Igen, de például youtubera nem lesz jó.

Meg lehetne oldani hogy egy mappa minden fájljára lefuttassa egy paranccsal?
Mármint persze hogy a
HANG_IMPUT.mp3
és a
VIDEO_OUTPUT.mp4
változó legyen miközben a KEP_IMPUT.jpg állandó?


ffmpeg -loop 1 -framerate 2 -i KEP_IMPUT.jpg -i HANG_IMPUT.mp3 -c:v libx264 -preset medium -tune stillimage -crf 18 -c:a copy -shortest -pix_fmt yuv420p VIDEO_OUTPUT.mp4

Példa.:
KEP_IMPUT.jpg + HANG_IMPUT_1.mp3 = VIDEO_OUTPUT_1.mp4
KEP_IMPUT.jpg + HANG_IMPUT_4.mp3 = VIDEO_OUTPUT_4.mp4

Visszakérdezek: miért nem jó neked, ha nem egy db ffmpeg fut, hanem N. db. (ahol N. a könyvtárban található mp3-k száma)?. Csak mert az nagyon egyszerű:

for i in *.mp3 ; do
HANG_INPUT="$i"
VIDEO_OUTPUT="${i%3}4"
ffmpeg .... -i "$HANG_INPUT" .... "$VIDEO_OUTPUT"
done

Ez technikailag 1 db. összetett shell parancs, amiben 4 db. ffmpeg processz jön létre :-)

=====
tl;dr
Egy-két mondatban leírnátok, hogy lehet ellopni egy bitcoin-t?

Ez még át kell gondolnom kipihent fejjel is mert megvallom, nem igazán értem mire gondolsz.

Az viszont fix hogy közel 900db MP3 kiterjesztésű fájlról van szó, mondjuk ezt megcsinálhatom tízesével is akár,
a lényeg hogy a fájlneveket, amik meglehetősen eltérnek egymástól, szóval nem számozva vannak vagy ilyesmi,
nekem ne egyenként kelljen megadnom a terminálban hanem tömegesen megcsinálja.

Hát ennek tök mindegy mennyien vannak, szépen sorban végigmegy rajta. Minden akarmi.mp3-ból csinal egy akarmi.mp4-et a kipontozott részek helyére írt ffmpeg-paraméterek függvényében.

=====
tl;dr
Egy-két mondatban leírnátok, hogy lehet ellopni egy bitcoin-t?

ffmpeg -loop 1 -i image.jpg -i audio.mp3 -c:a copy -c:v libx264 -shortest out.mp4