[英]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來實現這一目標。 但它確實會對您的代碼添加非常大的依賴性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.