Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> DirectShow: Проблема с компрессией видео, не удаётся задать кодек для сжатия видео 
:(
    Опции темы
demon051
Дата 26.7.2011, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 26.7.2011

Репутация: нет
Всего: нет



Всем привет!
Пытаюсь писать видео с web-камеры в файл avi.
Код такой:
Код

      IBaseFilter muxFilter = null;
      IBaseFilter videoCompressorFilter = null;
      private IBaseFilter capFilter;
      private IGraphBuilder   graphBuilder;
      private ICaptureGraphBuilder2 capGraphBuilder;
      private IVideoWindow    videoWin;
      private IMediaControl   mediaCtrl;
      private IMediaEventEx   mediaEvt;
       
       
      //процедура выбора видеоустройства
      //...
      //процедура выбора кодека
      //...
       
      bool StartupVideo( UCOMIMoniker mon )
          {
              int hr;
              try {
                  if( ! CreateCaptureDevice( mon ) )
                      return false;
       
                  if( ! GetInterfaces() )
                      return false;
       
                  if( ! SetupGraph() )
                      return false;
       
                  if( ! SetupVideoWindow() )
                      return false;
       
                  hr = mediaCtrl.Run();
                  if( hr < 0 )
                      Marshal.ThrowExceptionForHR( hr );
                  return true;
              }
              catch( Exception ee )
              {
                  MessageBox.Show( this, "Could not start video stream\r\n" + ee.Message, "DirectShow.NET", MessageBoxButtons.OK, MessageBoxIcon.Stop );
                  return false;
              }
          }
       
      bool CreateCaptureDevice( UCOMIMoniker mon )
          {
              object capObj = null;
              try {
                  Guid gbf = typeof( IBaseFilter ).GUID;
                  mon.BindToObject( null, null, ref gbf, out capObj );
                  capFilter = (IBaseFilter) capObj; capObj = null;
                  return true;
              }
              catch( Exception ee )
              {
                  MessageBox.Show( this, "Could not create capture device\r\n" + ee.Message, "DirectShow.NET", MessageBoxButtons.OK, MessageBoxIcon.Stop );
                  return false;
              }
              finally
              {
                  if( capObj != null )
                      Marshal.ReleaseComObject( capObj ); capObj = null;
              }
       
          }
       
      bool GetInterfaces()
          {      
              try {
       
       
                  graphBuilder = (IGraphBuilder)Activator.CreateInstance(Type.GetTypeFromCLSID(Clsid.FilterGraph, true));
       
                  Guid clsid = Clsid.CaptureGraphBuilder2;
                  Guid riid = typeof(ICaptureGraphBuilder2).GUID;
                  capGraphBuilder = (ICaptureGraphBuilder2)DsBugWO.CreateDsInstance(ref clsid, ref riid);
       
                  mediaCtrl   = (IMediaControl)   graphBuilder;
                  videoWin    = (IVideoWindow)    graphBuilder;
                  mediaEvt    = (IMediaEventEx)   graphBuilder;
                  return true;
              }
              catch( Exception ee )
              {
                  MessageBox.Show( this, "Could not get interfaces\r\n" + ee.Message, "DirectShow.NET", MessageBoxButtons.OK, MessageBoxIcon.Stop );
                  return false;
              }
              finally
              {          
              }
          }
       
      bool SetupGraph()
          {
              int hr;
       
              IFileSinkFilter sink = null;
       
                  try {
       
       
                  hr = capGraphBuilder.SetFiltergraph(graphBuilder);
                  if( hr < 0 )
                      Marshal.ThrowExceptionForHR( hr );
       
      #if DEBUG
                  DsROT.AddGraphToRot(graphBuilder, out rotCookie);
      #endif
       
                  hr = graphBuilder.AddFilter( capFilter, "Ds.NET Video Capture Device" );
                  if( hr < 0 )
                      Marshal.ThrowExceptionForHR( hr );
       
       
       
                  Guid sub = MediaSubType.Avi;
                  hr = capGraphBuilder.SetOutputFileName(ref sub, fileName, out muxFilter, out sink);
                  if (hr < 0)
                      Marshal.ThrowExceptionForHR(hr);
       
       
                  if (videoCompressorFilter != null)
                  {
                      hr = graphBuilder.AddFilter(videoCompressorFilter, "Video Compressor");
                      if (hr < 0) Marshal.ThrowExceptionForHR(hr);
                  }
       
                  Guid cat = PinCategory.Capture;
                  Guid med = MediaType.Video;
                  hr = capGraphBuilder.RenderStream(ref cat, ref med, capFilter, videoCompressorFilter, muxFilter);
                  if( hr < 0 )
                      Marshal.ThrowExceptionForHR( hr );
       
                  cat = PinCategory.Preview;
                  med = MediaType.Video;
                  hr = capGraphBuilder.RenderStream(ref cat, ref med, capFilter, null, null);
                  if (hr < 0)
                      Marshal.ThrowExceptionForHR(hr);
       
       
                  return true;
              }
              catch( Exception ee )
              {
                  MessageBox.Show( this, "Could not setup graph\r\n" + ee.Message, "DirectShow.NET", MessageBoxButtons.OK, MessageBoxIcon.Stop );
                  return false;
              }
              finally
              {          
                  if( sink != null )
                      Marshal.ReleaseComObject( sink ); sink = null;
              }
          }


При попытке запустить реденринг потока с указанным кодеком
hr = capGraphBuilder.RenderStream(ref cat, ref med, capFilter, videoCompressorFilter, muxFilter);

получаю ошибку (hr<0)

если вместо videoCompressorFilter указать null, то проглатывает и пишет в файл без компрессии.

В чём может быть дело, что неправильно делаю?
C DirectShow работаю только несколько дней, так что сильно не ругайтесь smile
Да, на всякий случай отмечу, что есть екзешник проги, написанной на С# с использованием той же DirectShow.Net, что юзаю я, которая цепляет эту же камеру и тот же кодек, который пытаюсь использовать я, и нормально записывает сжатое видео в файл.
Может есть у кого исходники простейшего (рабочего smile) примера записи с использованием кодека: установить граф, задать файл для вывода и кодек и начать запись, чтобы без лишних наворотов?
Заранее благодарен! 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0493 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.