2014-01-10 2 views
1

Я пишу программу для сохранения видео в веб-камере в файл. Я использую кодек x264, найденный здесь x264X264 Сообщение об ошибке при съемке видео

Когда я пытаюсь записать фреймы в файл, я получаю это сообщение об ошибке. error

x264vfw [предупреждение]: Несколько кадров, вероятно, будут потеряны. Способы исправить это:

x264vfw [предупреждение]: -если использовать VirtualDub или его вилку, чем вы можете включить опцию «VirtualDub Hack»

x264vfw [предупреждение]: -вы можете включить «Файл» выход режим

x264vfw [предупреждение]: -вы можете включить опцию 'Zero Latency'

Я нашел это VirtualDub Hack, но тогда я не использую Virtual Dub. Я не уверен, что означает режим вывода файлов и нулевая латентность.

Я думаю, что проблема связана с кодеком, поскольку, когда я перехожу к использованию другого кодека, все работает нормально. Я использую C# и emgu, но я не думаю, что там проблема.

EDIT

В случае код помогает

public static void StartCapture() 
{ 
    try 
    { 
     capture = new Capture(); 
     capture.SetCaptureProperty(Emgu.CV.CvEnum.CAP_PROP.CV_CAP_PROP_FRAME_WIDTH, 1920); //1920 
     capture.SetCaptureProperty(Emgu.CV.CvEnum.CAP_PROP.CV_CAP_PROP_FRAME_HEIGHT, 1080); //1080 

     CaptureOutput = new VideoWriter 
     (
      "capture output.avi", 
      CvInvoke.CV_FOURCC('X','2','6','4'), 
      50, //fps 
      (int)capture.GetCaptureProperty(Emgu.CV.CvEnum.CAP_PROP.CV_CAP_PROP_FRAME_WIDTH), 
      (int)capture.GetCaptureProperty(Emgu.CV.CvEnum.CAP_PROP.CV_CAP_PROP_FRAME_HEIGHT), 
      true 
     ); 

     if (capture != null) 
     { 
      capture.ImageGrabbed += SaveFrame; 
      capture.Start(); 
     } 
    } 
    catch (Exception e) 
    { 
     MessageBox.Show(e.ToString()); 
    } 
} 

static void SaveFrame(System.Object sender, EventArgs e) 
{ 
    Image<Bgr, Byte> video; 
    video = capture.RetrieveBgrFrame(); 
    CaptureOutput.WriteFrame(video); 
} 
+0

Я думаю, что использование контейнера avi с X264 может стать причиной некоторых проблем – sav

ответ

1

Я знаю, что это немного поздно, но я понял это. Решение (в окнах) должно установить -1 вместо четырёхэкземпляра кодека. Появится диалоговое окно, в котором вы можете выбрать кодек, и если вы выберете x264wfv, появится кнопка configure, которая позволяет вам настраивать эти параметры (для меня работает нулевая латентность). В следующий раз кодек будет использовать одни и те же настройки, поэтому вы можете запустить свою программу с кодом 4ccc.

+0

Спасибо за ответ, но сообщение об ошибке все еще присутствует. Я подозреваю, что проблема связана с моим использованием кодека x264 внутри контейнера AVI. Хотя это * можно * сделать, я думаю, что avi-контейнер плохо подходит для x264. Следовательно, сообщение об ошибке отмечает, что кадры могут быть потеряны. – sav

+0

Мне может понадобиться исследовать с помощью gstreamer и C++ для кодирования видео внутри лучшего контейнера, поскольку opencv и emgu не поддерживают это. – sav