很确定这是可行的,但我不确定如何实现它。
我的本地网络上有一个 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 秒视频。
这是我最终要做的事情
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/