如何在不使用opencv的情况下直接在c / c ++中从USB网络摄像头读取h264流作为文件?

时间:2018-03-06 16:20:43

标签: c++ c ffmpeg nvidia video4linux

我能够读取h264格式的视频文件并在其上进行一些机器学习推理。代码对于来自文件的输入非常好。下面的代码是Deepstream SDK

的示例代码
FileDataProvider(const char *szFilePath, simplelogger::Logger *logger)
    : logger_(logger)
    {
         fp_ = fopen(szFilePath, "rb");

        //fp_ = fopen("/dev/video0", "rb");


        if (nullptr == fp_) {
            LOG_ERROR(logger, "Failed to open file " << szFilePath);
            exit(1);
        }
        pLoadBuf_ = new uint8_t[nLoadBuf_];
        pPktBuf_ = new uint8_t[nPktBuf_];
        assert(nullptr != pLoadBuf_);
    }
    ~FileDataProvider() {
        if (fp_) {
            fclose(fp_);
        }
        if (pLoadBuf_) {
            delete [] pLoadBuf_;
        }
        if (pPktBuf_) {
            delete [] pPktBuf_;
        }
    }

什么是要求?

  • 请从Logitech c920网络摄像头中读取视频文件。
  • 我知道如何使用opencv从网络摄像头读取。但我不想在这里使用opencv。

我的研究

  • 使用v4l我们可以获取流并在vlc中显示它。
  • 相机支持以下格式。
  

@ubox:〜$ v4l2-ctl --device = / dev / video1 --list-formats

     

ioctl:VIDIOC_ENUM_FMT索引:0类型:视频捕获     像素格式:'YUYV'名称:YUYV 4:2:2

     

索引:1类型:视频捕获像素格式:'H264'   (压缩)名称:H.264

     

索引:2类型:视频捕获像素格式:'MJPG'   (压缩)名称:Motion-JPEG

如何做到这一点? - 现在如何将这个直播流送入  上面的示例代码使得它从网络摄像头读取而不是文件?

[更新-1] - 换句话说,v4l是否有一些选项可以将视频流写为h264共振峰?所以,当它(v4l)写入磁盘时,我可以像之前(代码上面)那样读取该文件。

[更新-2] - 我们可以使用 ffmpeg 而不是v4l。如果使用ffmpeg将视频流连续保存到磁盘的任何解决方案,以便其他程序读取该文件?

0 个答案:

没有答案