Python视频处理

0 投票
2 回答
1742 浏览
提问于 2025-04-18 12:48

我刚开始学Python,想做的是接收UDP视频流(从VLC播放,格式是H264),然后对视频进行一些修改并显示出来(使用Python 2.7)。

我用的是openCV(版本2.4.9),可以接收到视频帧并进行修改。现在我需要做的是用这些帧创建一个视频文件并显示出来,但我不需要保存帧和视频。

我试过FFMPEG和FFPLAY,它们在处理保存的视频帧时可以正常工作。

如果你能告诉我步骤或者其他的替代方法,我会很感激。

首先,对我之前的解释感到抱歉。以下是我尝试过的步骤:

  1. 接收UDP视频流。

  2. 修改视频流:我使用openCV从流中获取视频帧并对其进行修改,这部分是有效的。

    cap = cv2.VideoCapture("udp://224.1.1.1:1234")
    while(cap.isOpened()):
        success, image = cap.read()
        ...
        cv2.imwrite("./frames/frame%d.jpeg" %count, image)
        count += 1
    
  3. 创建视频并显示:我尝试了FFMPEG和FFPLAY。

    command1 = 'ffmpeg -i ./frames/frame%d.jpeg -c:v libx264 -vf fps=23.97 -pix_fmt yuv420p -f rawvideo -'
    command2 = 'ffplay -'
    
    pipe1 = sp.Popen(command1,stdout=sp.PIPE)  
    pipe2 = sp.Popen(command2,stdin=pipe1.stdout)
    

这些步骤都能正常工作,但我无法将帧或视频文件实际保存下来。我需要做的是在第二步之后,直接将视频帧传递给FFMPEG和FFPLAY进行播放,而不需要将它们保存到帧文件夹中。

2 个回答

0

你可以使用 cv2.imshow() 直接显示你处理过的画面,而不是把它们传给 ffplay 或 ffmpeg。比如说,你可以直接在代码里显示这些画面,而不是先把它们写入文件。

import cv2 
cap = cv2.VideoCapture("udp://224.1.1.1:1234") 
while(cap.isOpened()):
        success,image = cap.read()
        ......
        ......
        cv2.imshow("Video", image)
1
command1 = 'ffmpeg -y -f image2pipe -vcodec mjpeg -r 23.97 -i - -vcodec mpeg4 -pix_fmt yuv420p -c:v libx264 -r 23.97 -f avi - '
command2 = 'ffplay -'

pipe1 = sp.Popen(command1,stdin=sp.PIPE,stdout=sp.PIPE)
pipe2 = sp.Popen(command2,stdin=pipe1.stdout)


While(cap.isOpened()):
    success,raw_image = cap.read()
    pil_im = Image.fromarray(raw_image)
    pil_im.save(pipe1.stdin ,'JPEG')

这个对我来说有效,但有一些颜色问题。

撰写回答