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

时间:2018-05-01 12:31:28

标签: 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

这是我最终要做的事情

  

将所有已保存的视频上传到云端存储,然后删除本地副本

我试图将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)

1 个答案:

答案 0 :(得分:1)

我正在查看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文件。 -n1中的xargs选项告诉它只将一个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实例运行,你的工作将在上一个工作完成后按顺序运行。如果你想并行运行它们,你也可以这样做。