2017-12-10 33 views
0

私が書いたAndroid 5.2アプリケーションを使用して、自分のタブレットのフロントカメラからいくつかのビデオを録画しました。私は各ビデオの開始タイムスタンプをミリ秒(Unix時間)で保存しました。ビデオの各フレームのタイムスタンプを取得する

残念ながら、各動画のフレームレートが異なります(20から30まで)。 OpenCVので、私には、各動画のフレームレートを取得することができるよ:

import cv2 
video = cv2.VideoCapture(videoFile) 
fps = video.get(cv2.CAP_PROP_FPS) 

これがうまく機能し、理論的には、私はちょうど、ビデオの各フレームのために(原因ミリ秒に)1000/FPSを追加することができます。しかしこれは、フレームレートが記録全体を通して安定していることを前提としています。これが当てはまるかどうかわかりません。

フレームワークとは独立して、ビデオ内の各フレームのタイムスタンプ(ミリ秒単位)を取得する可能性はありますか?

+0

ビデオをどのように作成しましたか?どのコーデック/コンテナですか? –

答えて

2

あなたがほしいcv2.CAP_PROP_POS_MSEC。さまざまなキャプチャプロパティhereをすべて参照してください。 「だから、それはあなたを思わ

case CV_FFMPEG_CAP_PROP_POS_MSEC: 
    return 1000.0*(double)frame_number/get_fps(); 

編集:Dan Mašekが私に指摘したように、あなたがその財産をつかむときのOpenCVはexactly doing that calculation(少なくともあなたがFFMPEGを使用していると仮定した場合)であるように、実際に、それが見えます常に一定のフレームレート仮定に頼ることになる。しかし、一定のフレームレートを前提としていても、フレーム番号を掛け合わせて、それだけではなく、1000/fpsを追加することは重要です。長いビデオで大きな違いを生み出す浮動小数点数を繰り返し追加すると、エラーが発生します。

import cv2 

cap = cv2.VideoCapture('vancouver2.mp4') 
fps = cap.get(cv2.CAP_PROP_FPS) 

timestamps = [cap.get(cv2.CAP_PROP_POS_MSEC)] 
calc_timestamps = [0.0] 

while(cap.isOpened()): 
    frame_exists, curr_frame = cap.read() 
    if frame_exists: 
     timestamps.append(cap.get(cv2.CAP_PROP_POS_MSEC)) 
     calc_timestamps.append(calc_timestamps[-1] + 1000/fps) 
    else: 
     break 

cap.release() 

for i, (ts, cts) in enumerate(zip(timestamps, calc_timestamps)): 
    print('Frame %d difference:'%i, abs(ts - cts)) 

フレーム0の差:0.0
フレーム1差:0.0
フレーム2差:0.0
フレーム3差:1.4210854715202004e-14
フレーム4の差分:0.011111111111091532
例えばフレーム5の差:0.011111111111091532
フレーム6の差:0.011111111111091532
フレーム7の差異:0.011111111111119953
フレーム8の違い:0.022222222222183063
フレーム9の違い:0.022222222222183063
...
フレーム294の違い:0.8111111111411446

これはミリ秒単位で、もちろんです、ので、多分それは大きなことを思えません。しかし、ここで私は計算の中でほぼ1ms離れており、これはちょうど11秒のビデオです。とにかく、このプロパティを使うほうが簡単です。

+0

お返事ありがとうございました。 CAP_PROP_POS_MSECはビデオ録画中のフレームレートの変化を補償しますか? – machinery

+0

@機械番号一番上のフレームレート計算のコードは、* OpenCVのソースコードから*ですので、あなたがやっていたように計算しています。それは一定のFPSを仮定します。実際に可変フレームレートを使用していますか?あまり一般的ではありません。 –

関連する問題