0

我设法编写了一个代码来抽取我的视频,并且只取 ​​10 帧中的 1 帧,以便让我的神经网络在未来更有效地进行字符识别。新视频exit_video被很好地淘汰了,因为它比以前的视频快得多。

1:当我打印新视频的 fps 时,尽管抽取,我还是有 30

2:为什么我的新视频比较重?50.000 ko,第一个是 42.000 ko

谢谢你的帮助

import cv2
#import os
import sys


video = cv2.VideoCapture("./video/inputvideo.mp4")
frameWidth = int(video.get(cv2.CAP_PROP_FRAME_WIDTH))
frameHeight = int(video.get(cv2.CAP_PROP_FRAME_HEIGHT))
frameFourcc = int(video.get(cv2.CAP_PROP_FOURCC))
success,image = video.read()

if not success:
    print('impossible de prendre une frame')
    sys.exit()
    
fps = video.get(cv2.CAP_PROP_FPS)
print("fps de base " + str(fps))
print(frameFourcc)
count = 0
exit_file = 'decimated_v1.mp4'
exit_video = cv2.VideoWriter(exit_file, frameFourcc, fps, (frameWidth, frameHeight))
while True:
    if ((count % 10 ) ==0):
        exit_video.write(image)
    success,image = video.read()
    if not success:
        break
        
    count +=1
    
exit_video.release()
exit_video_info = cv2.VideoCapture("decimated_v1.mp4")
fps_sortie = exit_video_info.get(cv2.CAP_PROP_FPS)
print("fps de sortie " + str(fps_sortie))    
4

1 回答 1

0

抽取并非所有帧内帧的视频文件将需要重新编码。除非您的输入文件是 ProRes 或 MJPEG,否则很可能会出现这种情况。

由于您没有设置编码参数,OpenCV 可能最终会使用一些默认值,这些默认值最终会比您的输入文件具有更高的比特率。

与 OpenCV 及其selectfilter相比,您使用 FFmpeg 工具的时间可能会更好。

ffmpeg -i ./video/inputvideo.mp4 -vf select='not(mod(n\,10))' ./decimated_v1.mp4

将是使用输入中每十帧的基本语法;然后,您可以添加所需的编码参数,例如-crf调整 H.264 速率因子 - 或者,当然,您可以完全更改为不同的编解码器。

于 2021-06-09T08:00:59.977 回答