sme*_*ung 7 python mp4 frame-rate cv2
我正在尝试测量输入视频文件中的某些事件:“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()
Run Code Online (Sandbox Code Playgroud)
我试图为 fps 硬编码不同的值。似乎低于 29.5 fps 的所有内容都四舍五入到小数点零 (29 fps),而上面的所有内容都四舍五入到一位小数 (29.x fps)
所以我的问题是:
是否可以使用 mp4 格式获得任何 fps?
输出文件中实际使用的是哪个fps?
如何在输出文件中获得正确的 fps?
附加信息
我尝试了许多不同的值,范围从 28 fps 到 31 fps,并绘制了实际输出文件帧速率与预期的关系。这显示了某种分形行为,也许这个提示会激发这里的一些数学向导:)
OpenCV 使用一些工具包来进行编写。就我而言,在 iOS 上,OpenCV 使用本机 AVFoundation 库。AVFoundation(或 OpenCV api)似乎无法很好地处理具有许多有效数字的 fps 值,例如 29.7787878779,并且 OpenCV 的 api 或 AVFoundation 中的某些内容被错误地舍入。
为了解决这个问题,我在调用 VideoWriter::open 之前对一些有效数字进行了四舍五入
normalizedFPS = round(1000.0 * normalizedFPS) / 1000.0;
Run Code Online (Sandbox Code Playgroud)
希望它也适合你!
我见过 30,000 作为时间尺度建议,所以也许测试一下 1000.0 与 30,000.0
归档时间: |
|
查看次数: |
1130 次 |
最近记录: |