首页 > 解决方案 > 有没有办法让多个视频源循环与 ffmpeg 一起旋转?

问题描述

有什么办法可以让我说 4 个实时视频流并让它们在屏幕上循环播放?我想获取视频源并播放,等待 5 秒,转到下一个视频源,等待 5 秒,等等......以下是ffmpeg我想要使用的实际命令,到目前为止我唯一的想法是:

for rotation in $source4 $source5 $source6 $source7; do
    ffmpeg -rtsp_transport tcp -stimeout 100 -i $source1\
           -rtsp_transport tcp -stimeout 100 -i $source2\
           -rtsp_transport tcp -stimeout 100 -i $source3\
           -rtsp_transport tcp -stimeout 100 -i $rotation\
           -filter_complex "nullsrc=size=3840x2160 [base];\
           [0:v] setpts=PTS-STARTPTS [upperleft];\
           [1:v] setpts=PTS-STARTPTS [upperright];\
           [2:v] setpts=PTS-STARTPTS [lowerleft];\
           [3:v] setpts=PTS-STARTPTS [lowerright];\
           [base][upperleft] overlay=shortest=1 [tmp1];\
           [tmp1][upperright] overlay=shortest=1:x=1920 [tmp2];\
           [tmp2][lowerleft] overlay=shortest=1:y=1080 [tmp3];\
           [tmp3][lowerright] overlay=shortest=1:x=1920:y=1080"\
           -c:v h264_nvenc -preset llhq -f matroska - | ffplay -
           sleep 5
    done

正如您所看到的,考虑到让一切顺利进行需要多长时间,这将不是非常有效甚至不可用。如果有人有任何想法,我将不胜感激。我只精通 Linux shell 脚本 (Bash),所以目前我无法使用任何其他语言。我对其他工具或框架的尝试持开放态度。主要目标是为一组安全摄像头制作一个脚本,其中一个在马赛克中旋转通过所有其他摄像头供稿,其中不包括屏幕上已经出现的 3 个摄像头。它需要尽可能低的维护,即网络问题断开连接,它应该自动继续检查连接并在建立后重新启动。我可以很容易地在 Bash 脚本中做到这一点,但是将视频全部显示在屏幕上是一个挑战。ffplay对于每个提要,然后使用wmctrl或类似的方法将它们排列在屏幕上,但我仍然面临重新启动旋转的问题。

标签: ffmpegvideo-processing

解决方案


循环无限:

#!/bin/bash
INP=("input 1.mp4" test01.mkv test02.mkv test03.mkv)
while true; do
  for i in "${INP[@]}"; do
    ffmpeg -i "$i" -c:v h264_nvenc -t 5 -f matroska - | ffplay -autoexit -
  done
done

也许,更好的方法是单独启动每个输入并使用wmctrl


推荐阅读