Portál AbcLinuxu, 13. května 2025 19:42
Ahoj,
snažím se zjistit aspect ratio s ffmpeg (přes funkce v libavcodec), něco jak dělá následující příkaz:
mplayer -demuxer +lavf -identify -frames 0 -vo null -ao null -msglevel all=7 video_file.mp4 2>/dev/null | grep 'aspect='
Příklad výstupu:
aspect= 720*1024/(576*702)
Mplayer řádek s aspectem vypisuje v libmpdemux/demux_lavf.c:353 (svn revize 29463) a počítá následovně (pár řádků výše):
if(st->sample_aspect_ratio.num)
sh_video->aspect = codec->width * st->sample_aspect_ratio.num
/ (float)(codec->height * st->sample_aspect_ratio.den);
else
sh_video->aspect=codec->width * codec->sample_aspect_ratio.num
/ (float)(codec->height * codec->sample_aspect_ratio.den);
(st je AVStream*, codec je AVCodecContext*, obě z ffmpeg/libavcodec)
Když ale použiju stejný postup ve vlastním kódu, dostávám codec->sample_aspect_ratio.num == 0 (st->sample_aspect_ratio.num == 0, ale to i u mplayeru).
Zjevně něco chybí ale nevím co.
Zdroják viz příloha (řádek 86), případne highlightovaný zdroják (je to jenom mírně upraveno a zfunkčněno demo avcodec_sample.cpp z dokumentace ffmpegu). Link na problematické video (69 MB).
Vtip je v tom, že mplayer použije stejnou libavcodec ze stejného ffmpegu na stejném souboru a ty informace dostane. Někde něco dělá jinak.
[test@localhost 0]$ avcodec_sample dementni_posahane_video.mp4 [h264 @ 0x8053310]AVC: Consumed only 232 bytes instead of 238 [h264 @ 0x8053310]AVC: Consumed only 28 bytes instead of 34 Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'dementni_posahane_video.mp4': Duration: 00:02:56.32, start: 0.000000, bitrate: 5 kb/s Stream #0.0(eng): Video: h264, yuv420p, 720x576 [PAR 1024:702 DAR 640:351], 25 tbr, 25k tbn, 50 tbc Stream #0.1(eng): Audio: aac, 48000 Hz, 2 channels, s16 Aspect: 1024/702, dtg: 0 ##Using codec aspectPravdepodobne máš v Mplayer iné verziu libavcodec ako máš pri tom Ffmpeg.
Ahá, díky moc. Jsem si vůbec nevšim v tom dlouhém výpisu z 'ldd mplayer', že se nelinkuje se systémovou libavcodec/libavformat, místo toho obsahuje v zdrojácích vlastní.
Zjistit, s kterou verzí ffmpeg to funguje byl celkem záhul. Nakonec zabrala až ffmpeg z git HEAD (d707bdb494d7f258d0bc0ca10a2a33da0d97b562).
To je zrovna tři týdny po 0.5. Vývojáři ffmpeg se moc na nějaké tagy nebo branche nehrajou . Mají tam jedinou branch 0.5, jinak se dá verze dohledat jedině podle data nebo revize.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.