簡體   English   中英

python opencv videoWriter fps 四舍五入

[英]python opencv videoWriter fps rounding

我正在嘗試測量輸入視頻文件中的某些事件:“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.5 fps 的所有內容都四舍五入為一位小數 (29.x fps)

所以我的問題是:

是否有可能獲得任何 mp4 格式的 fps?

output 文件中實際使用了哪個 fps?

如何在 output 文件中獲取正確的 fps?

附加信息

我嘗試了從 28 fps 到 31 fps 的許多不同值,並繪制了實際的 output 文件幀率與預期的對比圖。 這顯示了某種分形行為,也許這個提示會激發這里的一些數學向導:)

預期與實際幀率

預期與實際幀率縮放

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

不幸的是 OpenCV 里面有一個 bug。我讀和寫了一個 46 分鍾的電影,有 2 秒丟失了(同樣的幀數,但不同的 FPS 寫在文件的 header 中)對我來說是一個大問題,因為我試圖加入另一個編輯器中的音頻信息,您可以看到缺少的 2 秒原始電影是 fps = (60/1.001) = 59.94005994... OpenCv 將此 fps 四舍五入為 60,無論我是否在 2 個地方寫了 59.94005994

  1. videoWriter = new VideoWriter( full_file_name, fourCC, fps, scaled_size, true);
  2. videoWriter.set(CAP_PROP_FPS, fps);

壞消息——我在 opencv 源代碼中找到了這段代碼

outfps = cvRound(fps);

bool AVIWriteContainer::initContainer(const String& filename, double fps, Size size, bool iscolor){
    outfps = cvRound(fps);
    width = size.width;
    height = size.height;
    channels = iscolor ? 3 : 1;
    moviPointer = 0;
    bool result = strm->open(filename);
    return result;
}

我們必須將此錯誤升級到 OpenCv 團隊(我使用 opencv-460.jar)我將嘗試使用其他程序手動更改 header - 這可以挽救一天

解釋缺失秒數的數學計算excel 找到丟失的秒數 少了2秒

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM