FFmpeg音視頻采集

文章目錄

  • 音視頻采集
  • 音頻采集
    • 獲取設備信息
    • 錄制麥克風
    • 錄制聲卡
  • 視頻采集
    • 攝像機畫面采集

音視頻采集

DirectShow(簡稱DShow)是一個Windows平臺上的流媒體框架,提供了高質量的多媒體流采集和回放功能,它支持多種多樣的媒體文件格式,包括ASF、MPEG、AVI、MP3和WAV文件,同時支持使用WDM驅動或早期的VFW驅動來進行多媒體流的采集。

  • DirectShow大大簡化了媒體回放、格式轉換和采集工作。但與此同時,也為用戶自定義的解決方案提供了底層流控制框架,從而使用戶可以自行創建支持新的文件格式或其他用戶的DirectShow組件。
  • DirectShow專為C++而設計。Microsoft不提供用于DirectShow的托管API。
  • DirectShow是基于組件對象模型(COM)的,因此當你編寫DirectShow應用程序時,你必須具備COM客戶端程序編寫的知識。對于大部分的應用程序,你不需要實現自己的COM對象,DirectShow提供了大部分你需要的DirectShow組件,但是假如你需要編寫自己的DirectShow組件來進行擴充,那么你必須編寫實現COM對象。
  • 使用DirectShow編寫的典型應用程序包括:DVD播放器、視頻編輯程序、AVI到ASF轉換器、MP3播放器和數字視頻采集應用。

音頻采集

獲取設備信息

void Widget::capture()
{avdevice_register_all(); // 注冊所有的設備qDebug() << "注冊設備完成";AVFormatContext *fmt_ctx = avformat_alloc_context();            // 分配一個格式上下文const AVInputFormat *input_fmt = av_find_input_format("dshow"); // 查找輸入格式if (!input_fmt){qDebug() << "找不到輸入格式";return;}AVDeviceInfoList *dev_list = nullptr; // 設備信息列表int ret = avdevice_list_input_sources(input_fmt, nullptr, nullptr, &dev_list); // 獲取設備信息列表if (ret < 0){qDebug() << "獲取設備信息列表失敗";return;}for (int i = 0; i < dev_list->nb_devices; i++){qDebug() << "設備名稱: " << dev_list->devices[i]->device_name;qDebug() << "設備描述: " << dev_list->devices[i]->device_description;// qDebug() << "設備類型: " << av_get_media_type_string(*(dev_list->devices[i]->media_types));qDebug() << "------------------------";}avdevice_free_list_devices(&dev_list);qDebug() << "設備信息獲取完成";
}

錄制麥克風

void Widget::recordMicrophone()
{const char *output_file = "../../output/record.pcm"; // 輸出文件路徑avdevice_register_all();                             // 注冊所有的設備AVDeviceInfoList *dev_list = nullptr;                // 設備信息列表const AVInputFormat *input_fmt = av_find_input_format("dshow"); // 查找輸入格式if (!input_fmt){qDebug() << "找不到輸入格式";return;}int ret = avdevice_list_input_sources(input_fmt, nullptr, nullptr, &dev_list); // 獲取設備信息列表if (ret < 0){qDebug() << "獲取設備信息列表失敗";return;}std::string device_name = "audio=";for (int i = 0; i < dev_list->nb_devices; i++){AVDeviceInfo *dev_info = dev_list->devices[i];if (dev_info){if (*dev_info->media_types == AVMEDIA_TYPE_AUDIO) // 判斷設備類型是否為音頻{device_name += dev_info->device_name; // 獲取設備名稱break;}}}avdevice_free_list_devices(&dev_list); // 釋放設備信息列表AVFormatContext *fmt_ctx = avformat_alloc_context(); // 分配一個格式上下文ret = avformat_open_input(&fmt_ctx, device_name.c_str(), input_fmt, nullptr); // 打開輸入設備if (ret < 0){qDebug() << "打開輸入設備失敗";return;}av_dump_format(fmt_ctx, 0, device_name.c_str(), 0); // 打印輸入設備信息std::ofstream output(output_file, std::ios::binary | std::ofstream::out); // 打開輸出文件,以二進制方式寫入if (!output.is_open()){qDebug() << "打開輸出文件失敗";return;}auto currentTime = std::chrono::steady_clock::now(); // 獲取當前時間AVPacket packet;                             // 分配一個數據包while (av_read_frame(fmt_ctx, &packet) >= 0) // 讀取數據包{output.write((char *)packet.data, packet.size);                                // 寫入數據包av_packet_unref(&packet);                                                      // 釋放數據包if (std::chrono::steady_clock::now() - currentTime > std::chrono::seconds(10)) // 錄音10秒后停止break;}output.close();                 // 關閉輸出文件avformat_close_input(&fmt_ctx); // 關閉輸入設備avformat_free_context(fmt_ctx); // 釋放格式上下文qDebug() << "錄音結束";
}

通過ffplay指令播放
在這里插入圖片描述

錄制聲卡

跟麥克風錄制一樣,略

視頻采集

查看支持的設備信息

 ffmpeg -list_devices true -f dshow -i dummy

在這里插入圖片描述

ffmpeg -f dshow -list_options true -i video="USB Camera"

在這里插入圖片描述

攝像機畫面采集

void Widget::recordCamera()
{const char *output_file = "../../output/record.yuv"; // 輸出文件名avdevice_register_all();                             // 注冊所有設備AVDeviceInfoList *dev_list = nullptr;const AVInputFormat *input_fmt = av_find_input_format("dshow"); // 查找輸入格式if (!input_fmt){qDebug() << "找不到輸入格式";return;}int ret = avdevice_list_input_sources(input_fmt, nullptr, nullptr, &dev_list); // 獲取設備信息列表if (ret < 0){qDebug() << "獲取設備信息失敗";return;}std::string device_name = "video="; // 設備名稱for (int i = 0; i < dev_list->nb_devices; i++){AVDeviceInfo *dev_info = dev_list->devices[i];if (dev_info){if (*dev_info->media_types == AVMEDIA_TYPE_VIDEO) // 判斷設備類型是否為視頻{device_name += dev_info->device_name;break;}}}avdevice_free_list_devices(&dev_list); // 釋放設備信息列表AVDictionary *options = nullptr;av_dict_set(&options, "pixel_format", "yuyv422", 0); // 設置像素格式av_dict_set(&options, "video_size", "1280x720", 0);  // 設置視頻大小av_dict_set(&options, "framerate", "10", 0);         // 設置幀率AVFormatContext *fmt_ctx = avformat_alloc_context();                           // 分配一個格式上下文ret = avformat_open_input(&fmt_ctx, device_name.c_str(), input_fmt, &options); // 打開輸入設備if (ret < 0){qDebug() << "打開輸入設備失敗";return;}av_dump_format(fmt_ctx, 0, device_name.c_str(), 0); // 打印輸入設備信息std::ofstream output(output_file, std::ios::binary | std::ofstream::out); // 打開輸出文件,以二進制方式寫入if (!output.is_open()){qDebug() << "打開輸出文件失敗";return;}auto currentTime = std::chrono::steady_clock::now(); // 獲取當前時間AVPacket packet;                                     // 分配一個數據包while (av_read_frame(fmt_ctx, &packet) >= 0)         // 讀取數據包{output.write((char *)packet.data, packet.size);                                // 寫入數據包av_packet_unref(&packet);                                                      // 釋放數據包if (std::chrono::steady_clock::now() - currentTime > std::chrono::seconds(10)) // 錄像10秒后停止break;}output.close();                 // 關閉輸出文件avformat_close_input(&fmt_ctx); // 關閉輸入設備avformat_free_context(fmt_ctx); // 釋放格式上下文qDebug() << "錄像結束";
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/66683.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/66683.shtml
英文地址,請注明出處:http://en.pswp.cn/web/66683.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【漫話機器學習系列】056.F1值(F1 score)

F1值&#xff08;F1 Score&#xff09; 定義 F1值是機器學習中一種用于評估模型性能的指標&#xff0c;特別適合用于 不平衡數據集 的分類任務。它是 精確率&#xff08;Precision&#xff09; 和 召回率&#xff08;Recall&#xff09; 的調和平均值。通過綜合考慮精確率和召…

Mac安裝Homebrew

目錄 安裝修改homeBrew源常用命令安裝卸載軟件升級軟件相關清理相關 安裝 官網 https://brew.sh/不推薦官網安裝方式&#xff08;很慢很慢或者安裝失敗聯網失敗&#xff09; 檢測是否安裝homebrewbrew -v執行安裝命令 蘋果電腦 常規安裝腳本 &#xff08;推薦 完全體 幾分鐘就…

在K8S中,如果后端NFS存儲的IP發送變化如何解決?

在Kubernetes中&#xff0c;如果后端NFS存儲的IP地址發生了變化&#xff0c;您需要更新與之相關的Peristent Volume(PV)或Persistent Volume Claim(PVC)以及StorageClass中關于NFS服務器IP的配置信息&#xff0c;確保K8S集群內的Pod能夠正確連接到新的NFS存儲位置。解決方案如下…

一文大白話講清楚webpack基本使用——9——預加載之prefetch和preload以及webpackChunkName的使用

文章目錄 一文大白話講清楚webpack基本使用——9——預加載之prefetch和preload1. 建議按文章順序從頭看&#xff0c;一看到底&#xff0c;豁然開朗2. preload和prefetch的區別2. prefetch的使用3. preload的使用4. webpackChunkName 一文大白話講清楚webpack基本使用——9——…

【Elasticsearch 】 聚合分析:桶聚合

&#x1f9d1; 博主簡介&#xff1a;CSDN博客專家&#xff0c;歷代文學網&#xff08;PC端可以訪問&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移動端可微信小程序搜索“歷代文學”&#xff09;總架構師&#xff0c;15年工作經驗&#xff0c;精通Java編…

tensorflow源碼編譯在C++環境使用

https://tensorflow.google.cn/install/source?hlzh-cn查看tensorflow和其他需要下載軟件對應的版本&#xff0c;最好一模一樣 1、下載TensorFlow源碼 https://github.com/tensorflow/tensorflow 2、安裝編譯protobuf&#xff08;3.9.2&#xff09; protobuf版本要和TensorFlo…

P8738 [藍橋杯 2020 國 C] 天干地支

兩種方法 #include<bits/stdc.h> using namespace std;int main(){int year;cin>>year;string tg[10] {"geng", "xin", "ren", "gui","jia", "yi", "bing", "ding", "wu&…

Python 常用運維模塊之OS模塊篇

Python 常用運維模塊之OS模塊篇 OS 模塊獲取當前工作目錄更改當前工作目錄返回當前目錄路徑返回上一級目錄路徑遞歸生成目錄路徑刪除目錄創建目錄刪除目錄列出特定目錄下文件和子目錄刪除某個特定文件重命名某個文件獲取某個文件/目錄的信息輸出目錄路徑分隔符輸出文件行終止符…

uniapps使用HTML5的io模塊拷貝文件目錄

最近在集成sqlite到uniapp的過程中&#xff0c;因為要將sqlite數據庫預加載&#xff0c;所以需要使用HTML5的plus.io模塊。使用過程中遇到了許多問題&#xff0c;比如文件路徑總是解析不到等。尤其是應用私有文檔目錄’_doc’。 根據官方文檔&#xff1a; 為了安全管理應用的…

使用 F12 查看 Network 及數據格式

在瀏覽器中&#xff0c;F12 開發者工具的 “Network” 面板是用于查看網頁在加載過程中發起的所有網絡請求&#xff0c;包括 API 請求&#xff0c;以及查看這些請求的詳細信息和響應數據的。以下以常見的 Chrome 瀏覽器為例&#xff0c;介紹如何使用 F12 控制臺查看 Network 里…

Redis 2.6.12在Win10系統上的安裝教程

諸神緘默不語-個人CSDN博文目錄 這個版本的安裝包是跟同事要的&#xff0c;em&#xff0c;如果真的需要這個版本的話可以跟我要&#xff1a; 解壓后雙擊第一個bat文件&#xff0c;即可掛起Redis服務&#xff1a;

分布式數據庫中間件(DDM)的使用場景

華為云分布式數據庫中間件&#xff08;DDM&#xff09;是一款專注于解決數據庫分布式擴展問題的中間件服務&#xff0c;突破了傳統數據庫的容量和性能瓶頸&#xff0c;能夠實現海量數據的高并發訪問。以下是九河云總結的DDM的典型使用場景&#xff1a; 1. 互聯網應用 在電商、…

Ubuntu16.04 安裝OpenCV4.5.4 避坑

Ubuntu16.04 安裝C版OpenCV4.5.4 Ubuntu16.04 VSCode下cmakeclanglldb調試c 文章目錄 Ubuntu16.04 安裝C版OpenCV4.5.41. 下載Opencv壓縮包2. 安裝Opencv-4.5.43. 配置OpenCV的編譯環境4.測試是否安裝成功 1. 下載Opencv壓縮包 下載Opencv壓縮包&#xff0c;選擇source版本。…

RabbitMQ集群安裝rabbitmq_delayed_message_exchange

1、單節點安裝rabbitmq安裝延遲隊列 安裝延遲隊列rabbitmq_delayed_message_exchange可以參考這個文章&#xff1a; rabbitmq安裝延遲隊列-CSDN博客 2、集群安裝rabbitmq_delayed_message_exchange 在第二個節點 join_cluster 之后&#xff0c;start_app 就會報錯了 (CaseC…

QT開發:事件循環與處理機制的概念和流程概括性總結

事件循環與處理機制的概念和流程 Qt 事件循環和事件處理機制是 Qt 框架的核心&#xff0c;負責管理和分發各種事件&#xff08;用戶交互、定時器事件、網絡事件等&#xff09;。以下是詳細透徹的概念解釋和流程講解。 1. 事件循環&#xff08;Event Loop&#xff09;的概念 …

博客搭建 — GitHub Pages 部署

關于 GitHub Pages GitHub Pages 是一項靜態站點托管服務&#xff0c;它直接從 GitHub 上的倉庫獲取 HTML、CSS 和 JavaScript 文件&#xff0c;通過構建過程運行文件&#xff0c;然后發布網站。 本文最終效果是搭建出一個域名為 https://<user>.github.io 的網站 創建…

網絡通信---MCU移植LWIP

使用的MCU型號為STM32F429IGT6&#xff0c;PHY為LAN7820A 目標是通過MCU的ETH給LWIP提供輸入輸出從而實現基本的Ping應答 OK廢話不多說我們直接開始 下載源碼 LWIP包源碼&#xff1a;lwip源碼 -在這里下載 ST官方支持的ETH包&#xff1a;ST-ETH支持包 這里下載 創建工程 …

【MySQL】存儲引擎有哪些?區別是什么?

頻率難度60%???? 這個問題其實難度并不是很大&#xff0c;只是涉及到的相關知識比較繁雜&#xff0c;比如事務、鎖機制等等&#xff0c;都和存儲引擎有關系。有時還會根據場景選擇不同的存儲引擎。 下面筆者將會根據幾個部分盡可能地講清楚 MySQL 中的存儲引擎&#xff0…

【系統環境丟失恢復】如何恢復和重建 Ubuntu 中的 .bashrc 文件

r如果你遇到這種情況&#xff0c;說明系統環境的.bashrc 文件丟失恢復&#xff1a; 要恢復 ~/.bashrc 文件&#xff0c;可以按照以下幾種方式操作&#xff1a; 恢復默認的 ~/.bashrc 文件 如果 ~/.bashrc 文件被刪除或修改&#xff0c;你可以恢復到默認的版本。可以參考以下…

人工智能丨智能化測試解決方案全面解析

智能化測試解決方案通過整合前沿的人工智能技術與自動化測試技術&#xff0c;為軟件產品的測試工作帶來了前所未有的高效與智能。 智能化測試解決方案主要內容 大語言模型私有部署&#xff1a;確保文檔理解、代碼分析和測試生成過程中的安全與隱私&#xff0c;讓你無后顧之憂…