2016-06-23 3 views
0

1000/60fpsミリ秒ごとウィンドウのスクリーンショットを取り、pngファイルとしてディレクトリに保存してから、VideoFileWriterを使用して、それらの画像からAVIファイルを作成します。しかし、私はどのようにフレームレートを使用するべきではありません。どのように定義すればよいですか? widthまたはheightに基づいていますか?私はvirtualdubで使用されているデフォルトのフレームレートをコピーしようとしましたが、1000であることがわかりました。私はそのレートを試しましたが、ビデオ出力はredicuosly slowでした。いくつかのドキュメントの例では25を使用しています。私はそれをどのように定義するのか本当にわからない。pngファイルをビデオファイルに変換するために使用される適切なフレームレートは何ですか?

  const int width = 1920; 
      const int height = 1080; 
      const int frameRate = 60; 

using (var writer = new VideoFileWriter()) 
      { 
       writer.Open("output.avi", width, height, frameRate, VideoCodec.MPEG4); 

       foreach (string file in Directory.EnumerateFiles(dest_path, "*.png")) 
       { 
        using (var img = (Bitmap)Image.FromFile(file)) 
        { 
         writer.WriteVideoFrame(img); 
        } 
       } 
      } 

コードscrenshotsを取るために使用される:、私はスクリーンショットを撮るためにタイマーを使用

int i = 0; 
     void doRecord() 
     { 
      using (var img = GetScreenshot(handle)) 
      { 
       string filename = Path.Combine(dest_path, string.Format("{0}.png", ++i)); 
       img.Save(filename, ImageFormat.Png); 
      } 
     } 

     public Bitmap GetScreenshot(IntPtr hwnd) 
     { 
      RECT rc; 

      if (!GetWindowRect(hwnd, out rc)) 
       throw new Win32Exception(Marshal.GetLastWin32Error()); 

      Bitmap bmp = new Bitmap(rc.right - rc.left, rc.bottom - rc.top, PixelFormat.Format32bppArgb); 
      using (var gfxBmp = Graphics.FromImage(bmp)) 
      { 
       IntPtr hdcBitmap = gfxBmp.GetHdc(); 
       bool succeeded = PrintWindow(hwnd, hdcBitmap, 0); 
       gfxBmp.ReleaseHdc(hdcBitmap); 
       if (!succeeded) 
       { 
        gfxBmp.FillRectangle(new SolidBrush(Color.Gray), new Rectangle(Point.Empty, bmp.Size)); 
       } 
       IntPtr hRgn = CreateRectRgn(0, 0, 0, 0); 
       GetWindowRgn(hwnd, hRgn); 
       Region region = Region.FromHrgn(hRgn); 
       if (!region.IsEmpty(gfxBmp)) 
       { 
        gfxBmp.ExcludeClip(region); 
        gfxBmp.Clear(Color.Transparent); 
       } 
       return bmp; 
      } 
     } 

次のように設定します

const int fps = 60; 
timer1.Interval = 1000/fps; 
timer1.Start(); 

private void timer1_Tick(object sender, EventArgs e) 
{ 
    doRecord(); 
} 
+0

私の理解では、平均的なモニタは60Hzで動作しますので、1/60秒間のスクリーンショットを撮ってください。 (これはあなたが求めているものですか?また、それを「定義する」とはどういう意味ですか?) – Eric

+0

私はすでに1/60秒でスクリーンショットを撮っています。私の質問は 'VideoFileWriter'から' Open() 'メソッドで渡されたフレームレートを定義する方法です。 60も1/60も、「通常の」ビデオ速度にはなりませんでした。それは速すぎた。 – Jack

答えて

2

cはまったくありません撮影した画像の形状やサイズ、フレームレートの関係

短い答え:

あなたが毎秒を取るどのように多くのスクリーンショットを計算し、その数、あなたのフレームレートにする必要があります。

ロング回答:

私はあなたが何フレームレート手段に欠けていると思う、私は説明します:(ほとんどの動物など) 人間の目には、基本的に私たちを可能にする「Persistence of Vision」と呼ばれる性質を持っていますオブジェクトの動きを連続的な動画像として解釈する。これは、すべてのビデオが基づいている概念です。

あなたが走っている人の写真を撮って、目の前でそれらを非常に速く渡すと、人が動いているのを見ることができます。しかし、必ずしも実際の人と同じ時間がかかるとは限りません。文脈のためにここにいくつかの数字を入れてみましょう。

あなたは友人スティーブに1キロ(約半マイル)を実行するように頼むと、彼は実行しているの写真をたくさん撮り始める。実際には、毎秒の写真60枚をとします。今、平均的な人は10 km/hで走行しますので、その走行速度を使用しましょう。 1時間に3600秒があり、360秒または6分と同じになるため、スティーブは1時間に1時間10分かかるでしょう。あなたは正確に(60 * 360)21600写真を撮影しました。

データ要約:

  • 長ラン:1キロ
  • 速度:毎時10キロ
  • 時間:毎秒360秒
  • 写真:60枚の
  • 合計写真:21600

今、写真を再現して見たいときには同じ時間がかかります彼らはスティーブがその距離を走ったときに、で撮影した60枚の写真を毎秒秒間表示する必要があります。つまり、1秒間に60枚の写真を表示することになります。ビデオを撮るときには、これらの写真のそれぞれを「フレーム」と呼ぶため、フレームレート(またはfps)のフレームを60フレーム/秒ので使用しています。

スティーブのスローモーションビデオを表示するには、fpsの量を減らす必要があります。スピードの半分は30fpsに下がります。それは12分のスローモーションビデオであなたをお手伝いします。

ビデオは通常、24 fpsの上で持っていることに注意してください、そして下は、より「遅れ」FPSはビデオが

注意を見ていきますしてください:私は真剣に、画面のためにその方法を使用することはお勧めしません。 /ウィンドウの記録は、コンピュータのリソース(CPU、RAM、ハードディスク)の無駄になります。すでにすべての録音とパッチ適用を行っているライブラリを探してください。残念ながら、私は推薦する必要はありません。

+0

私は60fps(私は1000/60ミリ秒ごとにスクリーンショットを撮る)を使って記録しますが、 'VideoFileWriter.Open()'で渡されたフレームレートで60fpsを使用すると、ハイパーファーストを実行するビデオ出力が得られます。 90の画像が3秒の画像に変わります – Jack

+0

60fpsで記録する場合、90画像は1.5秒の動画を作成する必要があります。動画の場合は24fpsを使用することをおすすめします。 重要なことは、記録されたのと同じ速度で再生することです。そのため、ビデオの速度が遅くなったり、速くなったりしません。 –

+0

これは私が理解していないことです:私は同じfps値として記録しています。私のコードをチェックして、私が行方不明になっているかどうかを確認してください...私はあなたの最後のアドバイスを無視していませんbtw、私はそれをチェックします。ディスクに保存してリソースを解放してください。 – Jack

1

人間の目は20fpsのフレームレートで見ることができます。優れたフレームレートは、それより1倍大きくなる可能性があります。しかし、これはあなたがビデオを作っているかどうかによって決まります。ビデオが唯一のものであれば私は30fpsを推奨します。

+0

私は60fps(私はレコードを行うのに使うのと同じ値)を試みましたが、ビデオ出力は非常に短いです。90枚の画像が3秒の動画に変わります – Jack

+0

90枚の画像が続く時間は何回ですか? –

+0

私は60 fpsでサンプリングしていないと思いますが、サンプリングコードを投稿できますか? –

関連する問題