[Megoldva] ffmpeg rosszul vág

Fórumok

Van egy online előadás mentéseként előállt MP4. (avc1 és mp4a-40-2 -ként megjelenő video és audio codecek). Már maga az MP4 is ffmpeg-gel lett MKV-ból (amiben VP9 és Vorbis volt).

Eredetileg parancssorban próbáltam ffmpeg-gel vágni az MKV-t, úgy ahogy évek óta szoktam. Aztán az hibázott, akkor konvertáltam MP4-be, azzal is hibázott. Aztán a LosslessCut nevű ffmpeg előkével próbáltam vágni - és értelemszerűen az is hibázott.

A kézi parancs így néz ki:

ffmpeg -ss 1:10:26.881 -to 1:24:36.799 -i bemenet.mp4 -codec copy kimenet.mp4

Az eredmény egyértelműen nem ott kezdődik, ahogy az időadatok alapján kellene. Néztem mpv-vel, sőt az ffmpeg-hez tartozó ffplay-jel is, egyértelműen jó idő adatokat adok meg, ugyanazt mutatja az mpv is meg az ffplay is, viszont vagy jó 30 másodperccel korábban vág. Azzal is játszottam, hogy próbáltam a -ss - azaz a kezdő időpontot előre/hátra mozgatni, de nem nagyon akarja az igazat.

Valami tipp, hogy egyáltalán mit keressek, milyen eszközzel? (Vagy éppen hogy lehet ugyanezt esetleg más CLI-vel megoldani? "Hallomásból" még a mencoder van meg, de nyilván van egy halom hasonló.)

Hozzászólások

Szerkesztve: 2023. 06. 19., h – 17:04

A keyframe-ek milyen intervallumban vannak a videóban? Lehet, hogy csak 30+ másodpercenként? Lossless módon vágni elvileg csak keyframe-nél lehet.

Hm, és ezt vajon hol látom? Továbbmegyek, ha mondjuk 30 sec-re van beállítva, akkor elképzelhető, hogy az MKV-ből MP4-be konvertálásnál (amikor ugye átkódolás is volt) meg lehetne adni neki 1-2 másodpercenkénti értéket is? Ha igen, valaki ezt is megsúgja? Értelemszerűen keresem is... )

Hm, és ezt vajon hol látom?

Az `ffprobe' -show_frames opciója minden frame-ről ki tudja írni a típusát (I, B, P) ebből téged az 'I' érdekel.
(A kimenet szűréséhez használd a jó öreg `grep'-et, pl. `ffprobe -show_frames -print_format compact valami.mp4 | grep 'media_type=video' | grep 'key_frame=1')

Továbbmegyek, ha mondjuk 30 sec-re van beállítva, akkor elképzelhető, hogy az MKV-ből MP4-be konvertálásnál (amikor ugye átkódolás is volt) meg lehetne adni neki 1-2 másodpercenkénti értéket is? Ha igen, valaki ezt is megsúgja?

Persze, az átkódolásnál legegyszerűbben az `ffmpeg' -g opciójával. 25 fps videó esetén a -g 25 opció használata azt fogja eredményezni, hogy másodpercenként lesz egy keyframe.

No eljutottam idáig: valamiért az eredeti videóban 10 másodpercenként, míg az átkódoltban 50 secenként van ez a bizonyos keyframe. Akkor most újrakódolom, és meglátjuk mi lesz. (Azt az egyet nem tudom, hogy ez évek óta nem okozott eddig problémát, pedig sose csináltam vele semmi extrát. Vajon mi változott.)

Válasz magamnak:

a Mauzi által emlegetett keyframe problémának tűnik. Kapott egy újragenerálást, és egyúttal explicit megadtam a -g opciót, ettől értelemszerűen nagyobb lett, de már simán tudott vágni mind parancssorból, mint a LosslessCut segítségével.

Kösz a tippet.

Viszont a hanggal tud fura bajokat csinálni az ffmpeg, ha nem találod el a keyframe idejét. A képet mindenképpen a keyframe-nél vágja, a hang meg valahogy elcsúszik. Nem feltűnő szemre, de pl az mplayerrel lejátszáskor a CT (correction time?) paraméter elmászik akár több másodpercre is. Gyanítom, hogy a streamben ilyenkor nincs szinkronban a kép a hanggal, és csak lejátszó korrigálja valahogy vissza.

Nem tudom minden file esetben így van-e, de volt már dolgom olyan mp4-gyel, aminél az ffmpeg ezt csinálta.

Régóta vágyok én, az androidok mezonkincsére már!

Én ezt Avidemux-szal szoktam megoldani, eddig bevált. Tud újratömörítés nélkül vágni, de persze csak keyframe-ek mentén, és szépen segít megkeresni, hogy az hol is van.

Eredetileg parancssorban próbáltam ffmpeg-gel vágni az MKV-t, úgy ahogy évek óta szoktam.

Mi is mkv-ba rögzítjük az előadásainkat, de én az MKVToolNix eszközeit használom az mkv-k szabás-varrásához, mert az nem kódol át semmit. Igaz persze, hogy az is csak keyframe-eknél tud vágni.

Csaba

Ezzel szoptam pár hónapja.

Copy-val nem tudsz vágni jól, csak akkor, ha átkódolod, mert nem lesznek megfelelő típusú frame-ek a megfelelő helyen. Ha átkódolással vágsz, akkor viszont van egy ritka hiba, hogy hosszabb lesz, mint kellene, ezt már tudod copy-val megfelelő hosszra vágni.