我正在尝试测量输入视频文件中的某些事件:“test.mp4”。这是通过几个步骤处理视频来完成的,其中每个步骤对视频数据执行一些操作并将中间结果写入新的视频文件。
输入视频的fps为:29.42346629489295 fps
下面我写了一个脚本来测试问题。当我使用这个脚本编写一个新文件时,fps在输出文件中被舍入到29.0 fps,这就是问题所在。
import cv2
import sys
inputfilepath = "test.mp4"
outputfilepath = "testFps.mp4"
video = cv2.VideoCapture(inputfilepath)
fps = video.get(cv2.CAP_PROP_FPS)
framecount = int(video.get(cv2.CAP_PROP_FRAME_COUNT))
width = int(video.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(video.get(cv2.CAP_PROP_FRAME_HEIGHT))
print("original fps: ", fps)
# fps = 29.4
print("writing fps: ", fps)
writer = cv2.VideoWriter(outputfilepath, 0x00000020, fps, (width, height))
for i in range(framecount):
success, image = video.read()
if not success:
break
writer.write(image)
writer.release()
video.release()
video = cv2.VideoCapture(outputfilepath)
fps = video.get(cv2.CAP_PROP_FPS)
# the next line will not print the same fps as I passed to cv2.VideoWriter(...) above.
print("output fps: ", fps)
video.release()
我试图对fps的不同值进行硬编码。似乎低于29.5 fps的所有内容都舍入到零小数(29 fps),并且上面的所有内容都会舍入到一位小数(29.x fps)
所以我的问题是:
是否可以使用mp4格式获取任何fps?
输出文件中实际使用了哪些fps?
如何在输出文件中获得正确的fps?
其他信息
我尝试了许多不同的值,范围从28 fps到31 fps,并绘制了实际输出文件帧率与预期值。这显示了某种分形行为,也许这个暗示会启动一些数学向导:)
答案 0 :(得分:0)
OpenCV 使用一些工具包来编写。就我而言,在 iOS 上,OpenCV 使用本机 AVFoundation 库。似乎 AVFoundation(或 OpenCV api)无法很好地处理具有许多有效数字的 fps 值,例如 29.7787878779,并且某些内容在 OpenCV 的 api 或 AVFoundation 中被错误地舍入。
为了解决这个问题,我在调用 VideoWriter::open 之前四舍五入了一些有效数字
normalizedFPS = round(1000.0 * normalizedFPS) / 1000.0;
希望它也适用于您!
我已经看到 30,000 被用作时间刻度推荐,所以也许可以测试 1000.0 与 30,000.0