2013-04-08 2 views
1

Edit:Как я могу создать AVI-видеофайл в режиме реального времени во время обработки моего приложения?

Это то, что я сделал: В Form1:

ScreenCapture sc; 
AviFile af; 

В Form1 конструкторе:

sc = new ScreenCapture(); 
af = new AviFile(); 

В Form1 timer1 тик события:

private void timer1_Tick(object sender, EventArgs e) 
     { 
      if (playImages == true) 
      { 
       timer1.Enabled = false; 
       play(); 
       timer1.Enabled = true; 
      } 
      else 
      { 
       af.CreateAvi(this.sc); 
      } 
     } 

Класс AviFile после изменения:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Drawing; 
using System.Data; 
using System.Text; 
using System.Windows.Forms; 
using AviFile; 
using ScreenShotDemo; 

namespace ScreenVideoRecorder 
{ 
    class AviFile 
    { 
     AviManager aviManager; 

     Bitmap bmp; 

     public AviFile() 
     { 
      aviManager = new AviManager(@"d:\testdata\new.avi", false); 
     } 

     public void CreateAvi(ScreenCapture sc) 
     { 
      bmp = new Bitmap(sc.CaptureScreen()); 
      VideoStream aviStream = aviManager.AddVideoStream(false, 25, bmp);//dlg.Rate, bmp); 
      aviStream.AddFrame(bmp); 
      bmp.Dispose(); 
     } 

     public AviManager avim 
     { 
      get 
      { 
       return aviManager; 
      } 
      set 
      { 
       aviManager = value; 
      } 
     } 
    } 
} 

В Form1 кнопку мыши событие, чтобы остановить:

private void button3_Click(object sender, EventArgs e) 
     { 
      timer1.Enabled = false; 
      if (af != null) 
      { 
       af.avim.Close(); 
      } 
     } 

Но прежде, чем я остановить его после того, как запустить его через несколько секунд снятия скриншотов: Это button1 которым запустить таймер и делать скриншоты:

private void button1_Click(object sender, EventArgs e) 
     { 
      playImages = false; 
      timer1.Enabled = true; 
     } 

Через несколько секунд им получить исключение:

Exception in AVIFileCreateStream: -2147205019 


System.Exception was unhandled 
    HResult=-2146233088 
    Message=Exception in AVIFileCreateStream: -2147205019 
    Source=AviFile 
    StackTrace: 
     at AviFile.VideoStream.CreateStreamWithoutFormat() 
     at AviFile.VideoStream.CreateStream() 
     at AviFile.VideoStream..ctor(Int32 aviFile, Boolean writeCompressed, Double frameRate, Bitmap firstFrame) 
     at AviFile.AviManager.AddVideoStream(Boolean isCompressed, Double frameRate, Bitmap firstFrame) 
     at ScreenVideoRecorder.AviFile.CreateAvi(ScreenCapture sc) in d:\C-Sharp\ScreenVideoRecorder\ScreenVideoRecorder\ScreenVideoRecorder\AviFile.cs:line 27 
     at ScreenVideoRecorder.Form1.timer1_Tick(Object sender, EventArgs e) in d:\C-Sharp\ScreenVideoRecorder\ScreenVideoRecorder\ScreenVideoRecorder\Form1.cs:line 61 
     at System.Windows.Forms.Timer.OnTick(EventArgs e) 
     at System.Windows.Forms.Timer.TimerNativeWindow.WndProc(Message& m) 
     at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) 
     at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg) 
     at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData) 
     at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context) 
     at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context) 
     at System.Windows.Forms.Application.Run(Form mainForm) 
     at ScreenVideoRecorder.Program.Main() in d:\C-Sharp\ScreenVideoRecorder\ScreenVideoRecorder\ScreenVideoRecorder\Program.cs:line 19 
     at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args) 
     at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) 
     at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 
     at System.Threading.ThreadHelper.ThreadStart_Context(Object state) 
     at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 
     at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 
     at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
     at System.Threading.ThreadHelper.ThreadStart() 
    InnerException: 

Исключение в классе: VideoStream которым не мой класс, это с сайта я скачал исходные файлы: http://www.codeproject.com/Articles/7388/A-Simple-C-Wrapper-for-the-AviFile-Library

Как я могу это исправить?

+0

Почему бы не просто создать CreateAvi в списке растровых изображений и пропустить сохранение файла/загрузку файла? Или даже лучше, если CreateAvi возьмет в себе видеопоток. –

ответ

1

Неясно, из вашего вопроса, что вы спрашиваете.

Но это, кажется, случай, который вы хотите, чтобы просто поставить скриншоты в AviFile непосредственно вместо сохранения их на диск, а затем загружать их в

Ключевой фрагмент кода заключается в следующем:.

bitmap = (Bitmap)Bitmap.FromFile(Form1.imagesFiles[n]); 
aviStream.AddFrame(bitmap); 
bitmap.Dispose(); 

Вместо того чтобы загружать их в память из файла вы можете просто сделать:

bitmap = new Bitmap(sc.CaptureScreen()); 
aviStream.AddFrame(bitmap); 
bitmap.Dispose(); 

Таким образом, вы не экономить на диск, вы просто вставляя непосредственно в поток AVI.

+0

Клинт, получающий aviStream, что он не назначен, поэтому он будет пустым все время. Обновленный мой вопрос с тем, что я изменил. –

+0

Я буду использовать aviManager для создания файла в событии click button3, в котором я остановлю таймер. Или я должен использовать его в таймере во время его запуска, чтобы он создал файл и будет его обновлять? –

+0

Я бы установил его как переменную поля в вашем классе, а затем, когда таймер работает, продолжайте добавлять к нему кадры, я предполагаю, что ваша цель - делать скриншоты и вставлять их в AVI? Если это так, вы хотите продолжать добавлять кадры с каждым снимком экрана, а затем, когда вы закончите, просто закройте диспетчер. Это просто вопрос перетасовки кода. – Clint

Смежные вопросы