我如何使用avformat_open_input函数(ffmpeg)

时间:2016-02-11 13:18:27

标签: c++ opencv video ffmpeg

我购买了HD HDMI to UVC设备,该设备具有HDMI视频源输入和用于视频输出的UVC here。 我将它从笔记本电脑A(输入源HDMI)连接到笔记本电脑B(输出USB) 我在笔记本电脑B上安装了Ubuntu 14.04桌面,在笔记本电脑A上安装了Win 8.1 B还安装了ffmpeg,opencv和sdl库 我的目标是通过B上的HD HDMI to UVC从A捕获视频和音频 所以我决定使用ffmpeg的libav 我看到this并使用avformat_open_input函数,但此函数返回错误 我认为错误发生是因为avformat_open_inputconst char * url)的第二个参数无效 我知道url应该像video:video device name:audio:audio card name 如何指明设备名称?

这是终端中v4l2-ctl --list-devices命令的结果。

HD WebCam (usb-0000:02:03.0-1):   
    /dev/video0
HD TV CAM (usb-0000:03:00.0-2.1):   
    /dev/video1

终端中arecord -l的结果。

**** List of CAPTURE Hardware Devices ****  
card 0: AudioPCI [Ensoniq AudioPCI], device 0: ES1371/1 [ES1371 DAC2/ADC]  
Subdevices: 1/1  
Subdevice #0: subdevice #0    
card 1: CAM [HD TV CAM], device 0: USB Audio [USB Audio]    
Subdevices: 1/1  
Subdevice #0: subdevice #0  

谢谢。

1 个答案:

答案 0 :(得分:1)

以下是使用FFmpeg API访问USB网络摄像头的解决方案。

int CaptureCam() 
  {

  avdevice_register_all(); /* for device & add libavdevice/avdevice.h headerfile*/
  avcodec_register_all();
  av_register_all();

  char *dev_name = "/dev/video0"; // here mine is video0 , it may vary.
  AVInputFormat *inputFormat =av_find_input_format("v4l2");
  AVDictionary *options = NULL;
  av_dict_set(&options, "framerate", "20", 0);

  AVFormatContext *pAVFormatContext = NULL; 

    // check video source
  if(avformat_open_input(&pAVFormatContext, dev_name, inputFormat, NULL) != 0)
  {
   cout<<"\nOops, could'nt open video source\n\n";
   return -1;
  }
  else
  {
   cout<<"\n Success !";
  }

  } // end function