簡體   English   中英

使用C ++訪問網絡攝像頭的FFMPEG

[英]FFMPEG with C++ accessing a webcam

我四處搜索,找不到任何關於如何使用C ++中的ffmpeg訪問網絡攝像頭的示例或教程。 任何示例代碼或任何幫助指向我的一些文檔,將不勝感激。

提前致謝。

我已經做了幾個月了。 您的第一個“問題”是ffmpeg(libavcodec和其他ffmpeg庫)不訪問網絡攝像頭或任何其他設備。

對於基本USB網絡攝像頭或音頻/視頻采集卡,首先需要驅動程序軟件才能訪問該設備。 對於Linux,這些驅動程序屬於Video4Linux(眾所周知的V4L2)類別,這些模塊是大多數發行版的一部分。 如果您使用的是MS Windows,那么您需要獲得一個允許您訪問該設備的SDK。 MS可能有一些東西可以訪問通用設備,(但根據我的經驗,如果他們工作的話他們不是很有能力)如果你已經做到這一點,那么你現在有了原始幀(視頻和/或音頻)。

然后你到了ffmpeg部分 - libavcodec - 它接收原始幀(音頻和/或視頻)並將它們編碼成流,然后ffmpeg可以復制到你的最終容器中。

我搜索過,但發現所有這些都很少的例子,而且大部分都是零食。

如果您不需要自己實際編寫代碼,命令行ffmpeg以及vlc可以訪問這些設備,捕獲並保存到文件,甚至是流。

這是我現在能做的最好的事情。

對於Windows使用dshow

對於Linux(如ubuntu),請使用Video4Linux(V4L2)。

FFmpeg可以從V4l2獲取輸入並且可以執行該過程。

要查找USB視頻路徑類型:ls / dev / video *例如:/ dev / video(n)其中n = 0/1/2 ....

AVInputFormat - 包含有關輸入設備格式/媒體設備格式的信息的Struct。

av_find_input_format(“v4l2”)[linux]

av_format_open_input(AVFormatContext,“/ dev / video(n)”,AVInputFormat,NULL)如果返回值為!= 0則出錯。

現在您已使用FFmpeg訪問攝像頭並可以繼續操作。

示例代碼如下。

    int CaptureCam() 
  {

  avdevice_register_all(); // for device 
  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

注意:必須包含頭文件<libavdevice / avdevice.h>

這真的沒有回答這個問題,因為我沒有為您提供純粹的ffmpeg解決方案,但是,我個人使用Qt進行網絡攝像頭訪問。 它是C ++,將有一個更好的API來實現這一目標。 但它確實會對您的代碼添加非常大的依賴性。

這絕對取決於網絡攝像頭 - 例如,在工作中我們使用IP攝像機通過網絡傳輸jpeg數據流。 USB會有所不同。

您可以查看DirectShow樣本,例如PlayCap (但它們也顯示AmCap和DVCap樣本)。 一旦你有了一個directshow輸入設備(你可能有本機提供的任何設備),你可以通過dshow輸入設備將它連接到ffmpeg。

並且花了5分鍾瀏覽ffmpeg網站來獲取這些鏈接,我看到 ......

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM