【问题标题】:ffmpeg: record/capture stream and do scene detection at the same timeffmpeg:记录/捕获流并同时进行场景检测
【发布时间】:2019-10-27 03:02:52
【问题描述】:

是否可以使用单个 ffmpeg 命令同时捕获(记录)RTSP 流捕获场景变化事件?我几乎可以做我想做的事:

ffmpeg -i 'rtsp://mystream' \
-map 0:v -map 0:a -c:v copy -c:a copy -f segment \
-segment_time 300 -segment_format matroska -strftime 1 "%Y%m%d%H%M%S_video.mkv" \
-map 0:v -an -filter:v "select='gt(scene,0.1)'" -frames:v 1 "%Y%m%d%H%M%S_scenechange.png"

这给了我很好的 300s 流片段保存到磁盘,以及当检测到场景变化时的 scene.png。 但是,scene.png 仅在我终止进程时出现,而当我这样做时,我只会得到最后一个场景事件。理想情况下,只要检测到场景变化,我想获得一个新的 PNG(或者甚至更好,一个短视频剪辑),而不会中断 video.mkv 的录制。我确信它可以通过管道和多个 ffmpeg 命令来完成,但为了简单起见(此时主要是我自己的好奇心),我想看看只用一个进程可以完成什么。

【问题讨论】:

    标签: video ffmpeg video-streaming


    【解决方案1】:

    使用-frames:v 1,您只会得到一个图像输出。如果图像输出没有 strftime,则按字面意思使用名称字符串。您还需要停止 ffmpeg 使用 -vsync 0 为图像输出生成恒定帧速率流(由于您将总输出限制为 1 帧,因此没有注意到)

    使用

    ffmpeg -i 'rtsp://mystream' \
    -map 0:v -map 0:a -c:v copy -c:a copy -f segment \
    -segment_time 300 -segment_format matroska -strftime 1 "%Y%m%d%H%M%S_video.mkv" \
    -map 0:v -an -filter:v "select='gt(scene,0.1)'" -vsync 0 -strftime 1 "%Y%m%d%H%M%S_scenechange.png"
    

    【讨论】:

    • 谢谢,成功了!现在的后续是,是否有可能每次都获得多帧(例如可能 5-6 帧)或场景变化事件的短视频,或者这种方法是否仅限于每个事件的单帧?
    • @Gyan 知道如何执行此操作,以便输出它检测到的每个场景的 mp4 文件,而不仅仅是带有时间戳的 png?
    猜你喜欢
    • 1970-01-01
    • 2016-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多