【问题标题】:How to convert encoded video file to raw video format | OpenCV to read the raw file如何将编码的视频文件转换为原始视频格式 | OpenCV 读取原始文件
【发布时间】:2020-08-30 06:16:13
【问题描述】:

如果有人可以指导我,将不胜感激:

1 - 如何将编码的视频文件 (.mp4) 转换为 原始视频格式。

2 - 如何读取此原始视频的帧 OpenCV 库中的文件?

 eg: To read the .mp4 I can use - 
 cv::VideoCapture cap("abc.mp4");

提前谢谢你。

【问题讨论】:

  • 为什么不直接阅读mp4
  • 您的意思是您想将mp4 的每一帧扩展至完整无损分辨率并将它们全部写入磁盘以使您的文件大很多很多倍?你为什么要这么做?
  • Hii Mark,OpenCV 利用 CPU 对 mp4 文件中的帧进行解码。我想测量我的应用程序的性能,所以我想要原始视频文件数据而不是编码视频文件。

标签: opencv image-processing video-processing opencv3.0 image-compression


【解决方案1】:

我不确定这是否明智(因为涉及的文件大小),但它可以满足您的要求。

# Generate sample movie with 250 frames of 640x480 pixels
ffmpeg -v warning -y -f lavfi -i testsrc=decimals=0:s=640x480:rate=25 -t 10 movie.mov

看起来像这样(除了这是一个由于 StackOverflow 限制而具有有限颜色和帧速率的 GIF):

# Check number of frames is 250
ffprobe -v error -select_streams v:0 -show_entries stream=nb_frames -of default=nokey=1:noprint_wrappers=1 movie.mov
250

# Check size. It is 54kB
-rw-r--r--     1 mark  staff       54939 14 May 10:02 movie.mov

# Now make into raw BGR24 video
ffmpeg -v error -i movie.mov -pix_fmt bgr24 -f rawvideo -an -sn movie.bgr24

# Check size. It is now 230400 kB = 640x480 pixels of 3 bytes BGR at 25 fps for 10s
-rw-r--r--     1 mark  staff   230400000 14 May 10:11 movie.bgr24

现在您可以在 OpenCV 中阅读它而无需进行任何视频解压缩。 C++ 不是我的强项,但这应该可行:

#include <vector>
#include <iostream>
#include <opencv2/opencv.hpp>

int
main(int argc,char*argv[])
{
   std::ifstream file("movie.bgr24", std::ios::binary);
   unsigned int i=0;

   std::vector<unsigned char> buffer(640*480*3);

   while(file.read((char *)&buffer[0],640*480*3)){
      i++;
      std::cout << "Frame: " << i << std::endl;
      cv::Mat img(cv::Size(640,480),CV_8UC3,&buffer[0]);
      cv::imshow ("RAW", img);
      cv::waitKey(0);
   }
}

【讨论】:

  • 嗨,马克,感谢您的宝贵意见
  • 我想要一个 mp4 文件而不是 movie.mov 文件。我可以通过运行“ffmpeg -i video.mp4 -c:v rawvideo -pix_fmt yuv420p out.yuv”命令将 .mp4 文件转换为原始视频格式。
  • 现在使用 -> "ffmpeg -v error -i out.yuv -pix_fmt bgr24 -f rawvideo -an -sn output.bgr24" 将 yuv 转换为 bgr 是否正确?
  • 我只制作了文件movie.mov,因为你没有提供文件!如果您的文件名为 movie.mp4,只需使用 ffmpeg -v error -i movie.mp4 -pix_fmt bgr24 -f rawvideo -an -sn movie.bgr24 将其设为 RGB24 原始文件
  • 嗨,马克,感谢您的快速回复。下面的代码我用来从这个文件 fstream infile 中读取帧;无符号整数 i=0; infile.open("movie.bgr24",ios::binary|ios::in);无符号字符*缓冲区=新无符号字符[921600]; while(infile.read((char *)&buffer,sizeof(buffer))){ cv::Mat img(Size(640,480),CV_8UC3,&buffer,640*3); imshow ("okay.jpg", img);
猜你喜欢
  • 1970-01-01
  • 2014-01-03
  • 1970-01-01
  • 2023-04-04
  • 1970-01-01
  • 2022-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多