C#でOpenCvSharpを使ってRTSPストリームを録画しています。
以下に示すソースの様なスレッドを作り、
同じfps, framewidth, frameheightのRTSPストリーム6本に対して
6スレッド起動、6本を同時録画しています。
そこでなぜか、ほぼ同じデータ量のRTSPストリーム6本なのにも関わらず、
起動した順に若いほうのスレッドほど保存ファイルのサイズ(ソース中の
dstFile)が大きい事に気づきました。
(以下FPS=10と仮定して書きます)
vSrc が IsOpened だったら Read する、というループなのですが、
敢えて Sleep を入れていません。
これが原因なんだろうな、とは思うのですが。。
1秒間にReadが10回だけ呼ばれる様に、
残り時間をミリミリ確認しながら正しくSleepさせる必要がある?
何故だ?
そもそもストリームには1秒間に10フレームしか届いて来ないのだから
先走って11回目のReadを実行してしまったスレッドは次のフレームが
届くまで待たされる筈で、
待たされたならそのタイミングで別のスレッドが動くんじゃないのか?
と。
vSrc.Read 関数は上記の様なタイムスライスを起こさない、
ブロッキングしてしまう関数、という事なのでしょうか?
ヘタにsleepを入れて記録時間がズレるのも嫌で
ミリミリの質問で恐縮なのですが、
知見のあるかたいらっしゃいましたらよろしくお願い致します。
<スレッドのソースです↓>
C#
1 /// <summary> 2 /// 録画スレッド 3 /// </summary> 4 /// <param name="dstFolder"></param> 5 /// <param name="srcURL"></param> 6 private void RecThread(string dstFile, string srcURL) 7 { 8 PUTLOG("Thread started. ----------------------------------------------------------"); 9 10 VideoWriter vDst = null; 11 12 while(true) 13 { 14 try 15 { 16 int fourcc = VideoWriter.FourCC('m', 'p', '4', 'v'); 17 VideoCapture vSrc = new VideoCapture(srcURL); 18 19 PUTLOG("RTSP stream is opened."); 20 PUTLOG("source :" + srcURL); 21 PUTLOG("fps :" + vSrc.Fps); 22 PUTLOG("frame width :" + vSrc.FrameWidth); 23 PUTLOG("frame height :" + vSrc.FrameHeight); 24 25 vDst = new VideoWriter(dstFile, fourcc, vSrc.Fps, new OpenCvSharp.Size(vSrc.FrameWidth, vSrc.FrameHeight), true); 26 27 PUTLOG("Capturing start..."); 28 29 while (vSrc.IsOpened()) 30 { 31 Mat mat = new Mat(); 32 try 33 { 34 if (vSrc.Read(mat)) 35 { 36 if (mat.IsContinuous()) 37 { 38 if (vDst != null) 39 { 40 vDst.Write(mat); 41 } 42 } 43 else 44 { 45 break; 46 } 47 } 48 else 49 { 50 break; 51 } 52 mat.Dispose(); 53 } 54 catch (Exception e) 55 { 56 PUTLOG("error : " + e.Message); 57 } 58 } 59 vSrc.Dispose(); 60 if (vDst != null) vDst.Dispose(); 61 62 PUTLOG("error : the RTSP stream is unknowingly closed. try reopening.. "); 63 } 64 catch (Exception e) 65 { 66 PUTLOG("error : " + e.Message); 67 } 68 Thread.Sleep(60000); 69 } 70 }
あなたの回答
tips
プレビュー