質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

1回答

5541閲覧

Webカメラを使ったタイムシフト再生の実装方法について

ariel200

総合スコア33

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2016/05/15 09:59

編集2016/05/15 12:51

スポーツのフォームチェック用に、ノートPCについているWebカメラで撮影して、任意の秒数
(1〜30秒くらいまで)を遅らせてからプレビュー画面に再生表示するソフトを開発したいです。

現状はVS Community 2015でC#フォームアプリケーション + AForge.NET 2.2.5を使っています。
まずはAForge.NETの勉強がてらWebカメラで撮影した動画をaviファイルとして保存、
再生する処理を実装する事はできました。

肝心のタイムシフト再生部分で実装方法が分からず困っています。そもそもどのような
考え方でタイムシフト再生が実現できるのか分からないというレベルです。

試した事は、保存しながら数秒後に再生させてみたのですが再生できませんでした。
(開始フレームから進まない)

タイムシフト再生のご経験がありましたら方法論だけでも結構ですのでご教示頂きたく、
よろしくお願い致します。

現在のソースを記載致します。撮影〜ファイル保存処理です。最終的にはタイムシフトの
プレビューをpictureBoxに表示したいです。
videoSource_Newframeメソッド内でフレーム毎のBitmapが取得できるので、そのBitmapデータを
使って実現できそうな気もします。

C#

1using System; 2using System.IO; 3using System.Collections.Generic; 4using System.ComponentModel; 5using System.Data; 6using System.Drawing; 7using System.Drawing.Imaging; 8using System.Diagnostics; 9using System.Linq; 10using System.Text; 11using System.Threading.Tasks; 12using System.Windows.Forms; 13using AForge.Video; 14using AForge.Video.DirectShow; 15using AForge.Video.FFMPEG; 16 17namespace WindowsFormsApplication1 18{ 19 public partial class Form1 : Form 20 { 21 private FilterInfoCollection videoDevices; 22 private VideoCaptureDevice videoSource; 23 private VideoFileWriter writer; 24 private string fileName = string.Empty; 25 26 public Form1() 27 { 28 InitializeComponent(); 29 } 30 31 private void Form1_Load(object sender, EventArgs e) 32 { 33 videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice); 34 writer = new VideoFileWriter(); 35 36 foreach (FilterInfo device in videoDevices) 37 { 38 comboBox1.Items.Add(device.Name); 39 } 40 41 videoSource = new VideoCaptureDevice(); 42 } 43 44 // 撮影開始/停止 45 private void button1_Click(object sender, EventArgs e) 46 { 47 if (videoSource.IsRunning) 48 { 49 terminate(); 50 } 51 else 52 { 53 videoSource = new VideoCaptureDevice(videoDevices[comboBox1.SelectedIndex].MonikerString); 54 VideoCapabilities cap = videoSource.VideoCapabilities[0]; 55 56 videoSource.NewFrame += new NewFrameEventHandler(videoSource_Newframe); 57 videoSource.Start(); 58 59 DateTime dt = DateTime.Now; 60 fileName = dt.ToString("yyyyMMdd_HHmmss") + ".avi"; 61 writer.Open(fileName, cap.FrameSize.Width, cap.FrameSize.Height, cap.AverageFrameRate, VideoCodec.MPEG4); 62 63 } 64 } 65 66 public void videoSource_Newframe(object sender, NewFrameEventArgs eventArgs) 67 { 68 Bitmap image = (Bitmap)eventArgs.Frame.Clone(); 69 70 /////////////////////////////// 71 // このBitmapを使って実現できる? 72 /////////////////////////////// 73 74 writer.WriteVideoFrame(image); 75 } 76 77 private void Form1_FormClosing(object sender, FormClosingEventArgs e) 78 { 79 if (videoSource.IsRunning) 80 { 81 terminate(); 82 } 83 } 84 85 private void terminate() 86 { 87 videoSource.Stop(); 88 writer.Close(); 89 } 90 } 91}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

AForge自体を使ったことがないし、コードも示されていないので、詳しいことはわからないのですが、例えばこちらのサンプルを見て判断するに。
C#でAForge.NET Frameworkを導入する方法
ファイル出力をもって出力としているようです。
保存しながら数秒後に再生とありますから、たぶん保存したファイルを保存中に再生しているのだと思いますが、ファイルとして出力する場合、基本的にファイルがすべて出力されないと解析できない場合がほとんどです。
ですので、Closeメソッドで保存を完了しないと完全なファイルではないので読み込めないのではないかと思います。

ですので、画像単位でアクセスできるローレベルなAPIかライブラリを使ったほうが良いかもしれません。

例えばですが、フレームごとにBMPファイルで出力するとか、YUV形式のベタな画像データで出力するとか、そういったことができるAPIでないと実現が難しいと思います。

投稿2016/05/15 12:17

CodeLab

総合スコア1939

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ariel200

2016/05/15 12:55

早々にご教示頂きありがとうございます! 仰る通り、Closeメソッド前だと読み込めませんでした。 >例えばですが、フレームごとにBMPファイルで出力するとか、 現状のソースを記載致しました。videoSource_Newframeメソッド内でフレーム毎のBitmapが取得できるのですが、このBitmapデータを使えば実現できそうでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問