python - 获取 ffmpeg 的结果并将其传递给 python 脚本

标签 python linux ffmpeg

很确定这是可行的,但我不确定如何实现它。

我的本​​地网络上有一个 Raspberry Pi 不断流式传输,我使用这个 ffmpeg 脚本将视频保存在 Pi 中。

ffmpeg -i http://0.0.0.0:8080/stream/video.mjpeg -vcodec copy -map 0 -f segment -segment_time 5 -segment_format mp4 capture-%05d.mp4

脚本相当简单,它在本地目录中连续加载和保存 5 秒视频。

enter image description here

这是我最终要做的事情

Upload all saved videos to a Cloud Storage, then delete the local copy

我试图将 ffmpeg 的输出通过管道传输到这样的 python 脚本,但它并没有像我想象的那样工作。

ffmpeg -i http://0.0.0.0:8080/stream/video.mjpeg -vcodec copy -map 0 -f segment -segment_time 5 -segment_format mp4 capture-%05d.mp4 | py test.py -p capture-%05d.mp4

这是我的脚本,只是为了获取视频的名称/路径

import argparse

if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument('-p', '--videoPath', type=str, help="Path to recorded video", required=True)
    args = parser.parse_args()

    print(args.videoPath)

最佳答案

我正在查看 ffmpeg 的手册页,发现了 loglevel 选项。

-loglevel [repeat+]loglevel | -v [repeat+]loglevel
       Set the logging level used by the library.  Adding "repeat+" indicates that repeated log output should not be compressed to the first line and the "Last message repeated n
       times" line will be omitted. "repeat" can also be used alone.  If "repeat" is used alone, and with no prior loglevel set, the default loglevel will be used. If multiple
       loglevel parameters are given, using 'repeat' will not change the loglevel.  loglevel is a string or a number containing one of the following values:

       verbose, 40
           Same as "info", except more verbose.

所以这是一个简单的单行解决方法,可以让事情在您的情况下正常工作-

ffmpeg -i my_vid_feed -vcodec copy -map 0 -f segment -segment_time 5 -loglevel 40 -segment_format mp4 capture-%05d.mp4 2>&1 | grep --line-buffered -Eo "segment:.+ended" | awk -F "'" '{print $2; system("")}' | xargs -n1 python my_processor.py -p

我只是解析 ffmpeg 的输出,当一个新文件被完全写入时,详细日志会发出这样一行 -

[segment @ 0x7fc253817000] segment:'capture-00002.mp4' count:2 ended

所以我只是从行中获取文件名并将其传递给那个 argparse python 文件。 xargs 中的 -n1 选项告诉它一次只将一个 arg 传递给 python 文件,然后使用该文件作为参数执行 python 脚本。 这是执行命令的输出 -

root$ ffmpeg -i my_vid_feed -vcodec copy -map 0 -f segment -segment_time 5 -loglevel 40 -segment_format mp4 capture-%05d.mp4 2>&1 | grep --line-buffered -Eo "segment:.+ended" | awk -F "'" '{print $2; system("")}' | xargs -n1 python my_processor.py -p
started
capture-00000.mp4
ended
started
capture-00001.mp4
ended
started
capture-00002.mp4
ended
started
capture-00003.mp4
ended

使用的 python 文件 - my_processor.py

import argparse
import time

if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument('-p', '--videoPath', type=str, help="Path to recorded video", required=True)
    args = parser.parse_args()
    print("started")
    print(args.videoPath)
    time.sleep(3)
    print("ended")

唯一可能的缺点是一次只会运行一个 python 实例,并且您的作业将在前一个作业完成后按顺序运行。如果您想并行运行它们,您也可以这样做。

关于python - 获取 ffmpeg 的结果并将其传递给 python 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50116513/

相关文章:

python - 在jupyter笔记本中处理密码

linux - 最稳定的 Drupal Linux 发行版?

c - ffmpeg.c 什么是 pts 和 dts ?这个代码块在 ffmpeg.c 中做了什么?

ffmpeg - 在 docker 容器中录制本地音频

python - PyWinAuto 问题 : can't access header's columns

Python 3.2 空闲 : range function - print or list?

python - scipy 和 numpy 逆 fft 返回复数而不是 float ,无法保存为 wav

linux - CentOS安装jdk时出错

c - 剖析 C 应用程序中的最大内存使用量 - linux

json - 有没有办法用ffmpeg按章节批量拆分文件,然后在windows中用mkvmerge重新组装?