OpenCV写文件MP4 flv avi

该博客介绍了如何使用OpenCV库来写入视频文件,特别提到了设置编码为X264的方式,并指出OpenCV生成的视频文件体积较大,没有找到直接控制码流的选项。此外,还提及了ffmpeg的movflags参数说明。示例代码中展示了一个FileWriter类,用于打开、关闭和写入视频帧。
摘要由CSDN通过智能技术生成

除了ffmpeg写视频外,很多时候我们也采用Opencv写视频文件,官方案例:入口

其它一些参考文件:
ffmpeg movflags 参数说明
opencv写文件
这里说明一点就是writerAlias->setFourcc(cv::VideoWriter::fourcc(‘X’, ‘2’, ‘6’, ‘4’));编码出来是x264

不过opencv写的视频文件都比较大,暂时没有看到能控制码流的参数,特别avi达到了20Mb/s

下面是一个参考类:

#ifndef FILEWRITER_H
#define FILEWRITER_H

#include "writer.h"

#include <opencv.hpp>

namespace flow {


class FileWriter {
public:
  using FileWriterPtr=std::make_shared<FileWriter>;
  
  explicit FileWriter(const std::string &file) {
  m_address=file;
  }
  
  FileWriter() = delete;
  FileWriter(FileWriter &&) = delete;
  FileWriter(const FileWriter &) = delete;
  FileWriter &operator=(FileWriter &&) = delete;
  FileWriter &operator=(const FileWriter &) = delete;
  ~FileWriter()  = default;

  bool write(const cv::Mat &frame) ;
  void setFourcc(int fourcc) { m_fourcc = fourcc; }
  static FileWriterPtr create() { return FileWriterPtr(new FileWriter("./test.avi")); }
  
  bool open() ;
  bool close() ;

protected:
  // use 'int64_t' for memory padding
  int64_t m_fourcc = cv::VideoWriter::fourcc('D', 'I', 'V', 'X');
  cv::Ptr<cv::VideoWriter> m_videoFileWriter;
  std::string m_address{};
};

} // namespace flow
#endif // FILEWRITER_H

#include "filewriter.h"

#include "xlog/xlog.h"

namespace flow {

bool FileWriter::open() {
  LOG_INFO("Open file to write: {} ...", m_param.address);
  m_videoFileWriter.reset(new cv::VideoWriter());
  return m_videoFileWriter->open(m_address, static_cast<int>(m_fourcc),
                                 double(25),
                                 cv::Size(2560, 1440));
}

bool FileWriter::close() {
  m_videoFileWriter.release();
  return true;
}

bool FileWriter::write(const cv::Mat &frame) {
  assert(!m_videoFileWriter.empty());

  cv::Mat dst;
  cv::Size size = cv::Size(2560, 1440);
  if (size != frame.mat.size()) {
    dst = cv::Mat(size, frame.type());
    cv::resize(frame, dst, size);
  } else {
    dst = frame;
  }

  *m_videoFileWriter << dst;
  return true;
}
using FileWriterPtr=std::make_shared<FileWriter>;
} // namespace flow

/main函数/
//example

void createMat(cv::Mat &mat){
//somewhere cteate mat
}
int main(){
FileWriterPtr writerPtr=FileWriter::create("./test.avi");
writerPtr->setFourcc(cv::VideoWriter::fourcc('X', '2', '6', '4'));//h264 fourcc('D', 'I', 'V', 'X') mpeg

writerPtr.open();
while(n < 1000){
cv::Mat mat;
createMat(mat);//somewhere get some mat
writerPtr.write(mat);
}
writerPtr.close();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值