ffmpeg를 사용하여 라이브 비디오 위에 레티클을 그리는 방법은 무엇입니까?

ffmpeg를 사용하여 라이브 비디오 위에 레티클을 그리는 방법은 무엇입니까?

라이브 비디오 피드에 조준선을 추가하려고 하는데 일부 외부 데이터를 기반으로 움직일 수 있도록 조준선이 필요합니다.

ffmpeg를 사용하여 비디오에 상자를 그릴 수 있습니다.

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

(지금은 비디오 파일을 테스트하고 있으므로 일부 부분이 더 간단해집니다.)

그러나 명령이 시작된 후에는 x및 값을 외부에서 조정할 수 있는 방법이 없는 것 같습니다 . y예를 들어 stdin 또는 에서 쉽게 읽을 수 있는 방법이 있다면 이상적이지만 /dev/shm/reticle-pos.txt그렇게 할 수 있는 방법을 찾을 수 없습니다.

내가 시도한 또 다른 옵션은 imagemagick을 사용하여 외부에서 레티클을 그린 다음 ffmpeg로 오버레이하는 것입니다.

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

그러나 ffmpeg는 각 프레임이 아닌 이미지 파일을 한 번만 읽는 것처럼 보이기 때문에 작동하지 않습니다.

레티클의 위치를 ​​제어할 수 있는 방식으로 비디오 위에 레티클을 어떻게 그릴 수 있습니까?

답변1

루프 옵션 사용:

ffmpeg -i input.mpg -loop 1 -f image2 -i /dev/shm/reticle.png -filter_complex overlay output.mpg
  • ffmpeg는 image2 demuxer의 루프 옵션을 사용하여 모든 프레임에서 reticle.png를 읽습니다.
  • 먼저 임시 파일에 새 레티클을 작성하고 이름을 Rectile.png로 변경하여 Rectile.png를 원자적으로 업데이트합니다.
  • 자세한 내용은 다음을 참조하세요.https://ffmpeg.org/ffmpeg-formats.html#image2-1

답변2

나는 이것을 할 수 있는 방법을 알아냈습니다. 아마도 가장 좋은 방법은 아니지만 작동합니다.

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

이는 imagemagick이 원시 픽셀 데이터( )를 출력하도록 하여 작동합니다 -size 1080x720 -depth 8 rgba:-. 각 프레임의 픽셀 데이터는 나머지 데이터와 함께 단일 원시 비디오 스트림으로 연결됩니다. 그런 다음 ffmpeg는 해당 원시 비디오 스트림( )을 읽고 -f rawvideo -pixel_format bgr32 -video_size 1080x720 -framerate 30 -i pipe:0이를 기본 비디오에 오버레이할 수 있습니다.

관련 정보