Python:3.6,Ubuntu 18.04,OpenCV 4.1.0
我有一个IP摄像机,该摄像机以H.264编码流式传输视频数据。我想获取此视频流,并使用Python将其保存为.avi文件,而无需进行任何编码或解码。使用命令行界面和ffmpeg命令,这很简单。
mycomputer@home:~$ ffmpeg -i rtsp://username:password@192.168.1.1/?framerate=30.0?streamprofile=defaultcameraprofile -acodec copy -vcodec copy output_file_name.avi
我想使用OpenCV在Python中做类似的事情。当前,我正在使用VideoCapture类读取每个帧,然后使用OpenCV VideoWriter类将该帧写入文件。我的问题是VideoWriter类需要一个four_cc代码来指定在编写过程中使用哪个编解码器,而我根本不想使用任何编解码器(或更确切地说,我想使用FFmpeg的流副本),但是据我所知,没有相应的four_cc代码)。 OpenCV文档指定如果我使用FFmpeg后端API并将编解码器和帧速率都指定为0,则应将原始流写入新文件。但是,当我这样做时,没有文件被创建。
cap = cv2.VideoCapture("rtsp://username:password@192.168.1.1/?framerate=30.0?streamprofile=defaultcameraprofile", cv2.CAP_FFMPEG)
frame_width = int(cap.get(3))
frame_height = int(cap.get(4))
# output file, backend API, four_cc code integer, framerate, frame size tuple
out = cv2.videoWriter("output_file.avi",cv2.CAP_FFMPEG,0,0,(frame_width,frame_height))
我已经尝试了许多其他输入参数组合到videoWriter构造函数中,但是所有这些组合要么重新编码流,要么不写输出文件。例如,我尝试了帧速率{0,30},输出文件扩展名{.avi,.mp4,.h264,.mkv,无}和编解码器{0,“ H.264”,“ RAW”, “ DBI”,“”,“ MPEG”,“ COPY”,“ NONE”}。
out = cv2.videoWriter("output_file.avi",cv2.CAP_FFMPEG,cv2.VideoWriter_fourcc('H','2','6','4'),30,(frame_width,frame_height))
是否可以在OpenCV中使用FFmpeg流副本来保存视频数据而不进行编码?如果没有,我将更改为从Python内部运行shell命令,但是如果可行的话,我希望使用前一种方法。
答案 0 :(得分:1)
经过大量的深入研究之后,我认为使用OpenCV中的VideoWriter类可能不是一种好方法。相反,我使用了使用子进程模块调用的ffmpeg命令行命令。
command = ['ffmpeg', '-i', 'rtsp://username:password@192.168.1.1/axis-media/media.amp?framerate=30.0', '-acodec', 'copy', '-vcodec', 'copy', '-r', '30.0', 'output_file.avi']
p = subprocess.Popen(command,stdin=subprocess.PIPE)
input("Press Enter to stop capture...")
os.kill(p.pid, 15)