ZBLOG

linux ffmpeg4.2.1 打开一个usb摄像头 c++代码

要在Linux上使用FFmpeg 4.2.1通过C++打开USB摄像头,可以参考以下示例代码。此代码演示如何打开USB摄像头,读取视频帧,并对每一帧进行解码和处理。

示例代码

extern "C" {
#include <libavformat/avformat.h>
#include <libavutil/imgutils.h>
#include <libswscale/swscale.h>
}

#include <iostream>

int main() {
    // 注册所有的编解码器和格式
    av_register_all();

    // 摄像头设备名称(根据实际情况可能会有所不同)
    const char* deviceName = "/dev/video0"; 

    // 打开输入视频流
    AVFormatContext* pFormatCtx = nullptr;
    if (avformat_open_input(&pFormatCtx, deviceName, nullptr, nullptr) != 0) {
        std::cerr << "Could not open the video device." << std::endl;
        return -1;
    }

    // 查找流信息
    if (avformat_find_stream_info(pFormatCtx, nullptr) < 0) {
        std::cerr << "Could not find stream information." << std::endl;
        avformat_close_input(&pFormatCtx);
        return -1;
    }

    // 找到第一个视频流
    int videoStreamIndex = -1;
    for (unsigned int i = 0; i < pFormatCtx->nb_streams; ++i) {
        if (pFormatCtx->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
            videoStreamIndex = i;
            break;
        }
    }

    if (videoStreamIndex == -1) {
        std::cerr << "Could not find a video stream." << std::endl;
        avformat_close_input(&pFormatCtx);
        return -1;
    }

    AVCodecParameters* pCodecParams = pFormatCtx->streams[videoStreamIndex]->codecpar;

    // 查找解码器
    AVCodec* pCodec = avcodec_find_decoder(pCodecParams->codec_id);
    
   if (!pCodec) {
       std::cerr << "Unsupported codec!" << std::endl;
       avformat_close_input(&pFormatCtx);
       return -1;
   }

   // 打开解码器
   AVCodecContext* pCodecCtx = avcodec_alloc_context3(pCodec);

   if (!pCodecCtx) {
       std::cerr << "Could not allocate codec context." << std::endl;
       avformat_close_input(&pFormatCtx);
       return -1; 
   }
   
   if (avcodec_parameters_to_context(pCodecCtx, pCodecParams) < 0) {
       std::cerr << "Failed to copy codec parameters to decoder context." << std::endl; 
       avcodec_free_context(&pCodecCtx); 
       avformat_close_input(&pFormatCtx); 
       return -1; 
   } 

   if (avcodec_open2(pCodecCtx, pCodec, nullptr) < 0) { 
      std::cerr << "Could not open codec." << std::endl; 
      avcodec_free_context(&pCodecCtx); 
      avformat_close_input(&pFormatCtx); 
      return -1; 
   } 

   AVPacket packet; 
   
   while (true) {     
       if (av_read_frame(pFormatCtx, &packet) >= 0) {         
           if (packet.stream_index == videoStreamIndex) {             
               // 解码视频帧             
               AVFrame* pFrame = av_frame_alloc();             
               int response = avcodec_send_packet(pCodecCtx, &packet);             
               if (response >= 0) {                 
                   while (response >= 0) {                     
                       response = avcodec_receive_frame(pCodecCtx, pFrame);                     
                       if (response == AVERROR(EAGAIN)) break;                     
                       else if (response < 0){                         
                           break;                     
                       }                      
                       
                       // 在这里处理每一帧,比如保存或者显示                        
                       // 可以使用 libswscale 转换为RGB图像等                    
                   }                 
               }              
               
               av_frame_free(&pFrame);             
           }           
           av_packet_unref(&packet);       
       }
   }

   // 清理资源
   avcodec_free_context(&pCodecCtx);  
   avformat_close_input(&pFormatCtx);

   return 0;
}

编译与运行

确保你已经安装了FFmpeg开发库,并且版本为4.2.1。你可以用如下命令编译:

g++ your_file.cpp -o output_program -lavformat -lavcodec -lavutil -lswscale

注意事项

  • 错误处理: 上面的代码中对错误处理进行了基本实现,但在实际应用中应进行更细致的检查。
  • 依赖项: 确保系统中已安装FFmpeg及其开发文件。
  • 设备权限: 在访问 /dev/video0 时,请确保有足够的权限。如果没有权限,可以尝试以root用户运行或调整设备权限。
  • 帧处理: 根据需求,添加对视频帧的进一步处理,如转换、保存或显示等。

此代码是一个简化版的示例,用于演示如何使用FFmpeg API打开并读取USB摄像头的视频流。在实际应用中,还需考虑性能优化和更多功能实现。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://sdn.0voice.com/?id=6215

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?