< HomePage | Снимки
<- Сряда, 11 Април 2007 | Начална страница | Петък, 13 Април 2007 ->
Четвъртък, 12 Април 2007

С кратката изрезка код по-долу и с помощта на mencoder можете да направите филмче от само една картинка. Подобни филмчета ползваме в IPTV.bg за показване на съобщения за грешки в плеърите на гледащите (внимание грозен код (:

#!/bin/bash

ext="png"
msg="invalid_request"
file="$msg.$ext"
output="$msg.asf"
seconds=10

# Create "frames"
rm -rf tmp-*.$ext &>/dev/null
for i in `seq 100 $[100+($seconds*25)]`; do
    ln -sf ${file} tmp-${i}-${file}
done

mencoder \
    -lavfopts i_certify_that_my_video_stream_does_not_use_b_frames \
    -of lavf -lavfopts format=asf \
    -ovc lavc -lavcopts vcodec=wmv2:mbd=0:aspect=4/3 \
    -ofps 5 \
    mf://*.png -o $output 2>&1 | grep -v ^Skipping

rm -rf tmp-*.$ext

Mencoder е настроен да генерира ASF формат с WMV2 кодек, но ако промените lavf и lavc опциите, можете да получите Xvid и AVI контейнер или нещо друго в зависимост от нуждите ви. -ofps 5 го ползвам, защото доста намалява размера на филмчето. При условие, че няма да има никакво движение 25 кадъра изобщо не са нужни, а 5 е добър баланс.

[ Коментари: 8 ]
Коментари

Мда, грозно си е - и аз ползвах такова нещо, за да направя фоновете, които вървяха докато нямаше живо предваване за оpenfest и т.н... Винаги съм се чудел що няма възможност 'хвани ей-тая картинка и я сложи 300 пъти' например.

Написа Васил Колев (www) на 12-Apr-2007 11:53


Щото не си заслужава когато си в unix среда :)

Написа Георги Чорбаджийски (www) на 12-Apr-2007 11:55


mf://@files.list и ще си спестиш правенето на сума ти линкове;)
Също така можеш да спестиш доста ако ползваш -mf fps=1 примерно (default-а е 25) и задължително ползване на -vf harddup при смесители (muxers) различни от avi.
Не съм пробвал но fps по принцип са тип float, така че е възможно да приемат и стойности по-малки от 1 :)

Написа Иван Кълвачев на 12-Apr-2007 12:08


С fps=1 VLC се държи странно, затова съм оставил малко повече кадри, че да не се шашка. А и mplayer доста бавно реагира на команди когато е с fps=1.

harddup
Only useful with MEncoder. If harddup is used when encoding, it will force duplicate frames to be encoded in the output. This uses slightly more space, but is necessary for output to MPEG files or if you plan to demux and remux the video stream after encoding. Should be placed at or near the end of the filter chain unless you have a good reason to do otherwise.

ама точно harddup не май искам :)

ако съм разбрал правилно във @files.list предполагам мога да напиша:
file.png
file.png
file.png
file.png

така ли?

Написа Георги Чорбаджийски (www) на 12-Apr-2007 12:45


Да, такъв е формата на files.list.

Сега направих една проба

mencoder mf://*.png -mf fps=1/30 -ofps 5 -vf scale,harddup [...]

и mencoder сам си дублира първата картинка 149 пъти (150 с оригинала).

Идеята с -mf fps 1/30 -ofps 5, е че mencoder взима входно видео с честота 1/30 кадъра в секунда (тоест 1 кадър на 30 секунди) и дублира кадрите докато достигне -ofps 5 изходна честота от пет кадъра в секунда. Картинките се дублират след декодирането им (в случая и след смяната на цветовия формат) което е максимално оптимално.

Можеш да ползваш и -ofps 30 (или произволна друга стойност). encoder-ът е достатъчно умен да забележи че няма движение и да компенсира кадрите. Можеш да добавиш -lavcopts vhq:trell:mv0:cbp за по-сигурно (mv0 пробва първо нулев вектор на движение, но изисва mbd>0/vhq, cbp - coded block pattern, пропуска кодирането на блокове с разлики под зададен праг, trell е необходим за анализа на cbp). Моите тестове не показаха значително подобрение, само значително забавяне ;)

Написа Иван Кълвачев на 12-Apr-2007 14:02


Последния абзац от предишния ми коментар можеш да го игнорираш,(аз бих го изтрил ;)

Написа Иван Кълвачев на 12-Apr-2007 14:19


Лесна работа, ама не разбрах защо? На мен ми изглежда напълно смислен като го прочетох.

Написа Георги Чорбаджийски (www) на 12-Apr-2007 14:23


Защото независимо колко малък е кадъра, ofps 30 ще бъде 6 пъти по-голям от ofps 5, просто защото ще има 6 пъти повече кадри.
В avi има един трик, записва се frame с големина 0, което показва че предишния кадър се повтаря. Точно защото този трик се ползва от mencoder се налага употребата на harddup.

Написа Иван Кълвачев на 12-Apr-2007 14:54