Ffmpeg ile canlı video üzerinde bir dürbün nasıl çizilir?


0

Canlı bir video yayınına bir retikül eklemeye çalışıyorum ve bazı harici verilere göre hareket edebilmek için retiküle ihtiyacım var.

Ffmpeg ile video üzerinde bir kutu çizebilirim:

ffmpeg -i input.mpg -vf drawbox=x=100:y=100:w=20:h=20:c=red output.mpg

(Şimdilik sadece video dosyaları ile test ettiğime dikkat edin, çünkü bunun bazı bölümlerini daha kolay hale getirir.)

Ancak, komut başladıktan sonra xve ydeğerleri harici olarak ayarlamanın bir yolu görünmüyor . Bunları, örneğin stdin'den okumanın kolay bir yolu olsaydı, bu ideal olurdu ya da /dev/shm/reticle-pos.txtbunu yapmanın bir yolunu bulamıyorum.

Denediğim bir diğer seçenek ise dürbünün dışına imagemagick ile çizip ffmpeg ile kaplamak:

while true; do
    for x in {100..500..1}; do
        convert -size 1080x720 xc:none -fill none -stroke red -strokewidth 2 \
            -draw "ellipse $x,100 10,10 0,360" -scale 1080x720 /dev/shm/newreticle.png
        cp /dev/shm/newreticle.png /dev/shm/reticle.png
        sleep 0.001
    done
done &

ffmpeg -i input.mpg -i /dev/shm/reticle.png -filter_complex overlay output.mpg

Ancak bu işe yaramaz, ffmpeg görüntü dosyasını her karede değil, yalnızca bir kez okur göründüğü gibi.

Reticle'nın konumunu kontrol etmeme izin verecek şekilde videonun üzerine bir retikül nasıl çizebilirim?

Yanıtlar:


2

döngü seçeneğini kullanarak:

ffmpeg -i input.mpg -loop 1 -f image2 -i /dev/shm/reticle.png -filter_complex overlay output.mpg
  • ffmpeg, image2 demuxer'ın loop seçeneğini kullanarak her karede reticle.png dosyasını okur.
  • Önce temp dosyasına yeni bir retikül yazarak rectile.png dosyasını atomik olarak güncelleyin ve sonra rectile.png olarak yeniden adlandırın.
  • Ayrıntılar için: https://ffmpeg.org/ffmpeg-formats.html#image2-1

0

Bunu yapmanın bir yolunu buldum. Muhtemelen en iyi yol değil, ama işe yarıyor:

reticle(){
    convert -size 1080x720 xc:none \
        -fill none -stroke red -strokewidth 2 -draw "ellipse $1,$2 10,10 0,360" \
        -size 1080x720 -depth 8 rgba:-
}
export -f reticle

parallel -k reticle {} 100 ::: {100..500} \
| ffmpeg \
    -i input.mpg \
    -f rawvideo -pixel_format bgr32 -video_size 1080x720 -framerate 30 -i pipe:0 \
    -filter_complex overlay \
    -y -c libx264 output.mpg

Bu, imagemagick çıktı ham piksel verisine ( -size 1080x720 -depth 8 rgba:-) sahip olarak çalışır . Her karenin piksel verileri, geri kalanıyla birlikte tek bir ham video akışında birleştirilir. ffmpeg bu ham video akışını ( -f rawvideo -pixel_format bgr32 -video_size 1080x720 -framerate 30 -i pipe:0) okuyabilir ve onu ana videoya yerleştirebilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.