Image processing 从大型YUV文件中提取一些YUV帧
我正在寻找WIN32程序,将大的1920x1080px 4:2:0.YUV文件(cca.43GB)的一部分复制到较小的.YUV文件中。我使用的所有程序,即YUV播放器,一次只能复制/保存一帧。将YUV原始数据切割成更小的YUV视频(图像)的最简单/合适的方法是什么?类似于ffmpeg命令的内容:Image processing 从大型YUV文件中提取一些YUV帧,image-processing,video-capture,video-processing,yuv,Image Processing,Video Capture,Video Processing,Yuv,我正在寻找WIN32程序,将大的1920x1080px 4:2:0.YUV文件(cca.43GB)的一部分复制到较小的.YUV文件中。我使用的所有程序,即YUV播放器,一次只能复制/保存一帧。将YUV原始数据切割成更小的YUV视频(图像)的最简单/合适的方法是什么?类似于ffmpeg命令的内容: ffmpeg -ss [start_seconds] -t [duration_seconds] -i [input_file] [outputfile] 这里是代码的最小工作例子,用C++编写,如果
ffmpeg -ss [start_seconds] -t [duration_seconds] -i [input_file] [outputfile]
这里是代码的最小工作例子,用C++编写,如果有人会搜索一个简单的解决方案:
// include libraries
#include <fstream>
using namespace std;
#define P420 1.5
const int IMAGE_SIZE = 1920*1080; // ful HD image size in pixels
const double IMAGE_CONVERTION = P420;
int n_frames = 300; // set number of frames to copy
int skip_frames = 500; // set number of frames to skip from the begining of the input file
char in_string[] = "F:\\BigBucksBunny\\yuv\\BigBuckBunny_1920_1080_24fps.yuv";
char out_string[] = "out.yuv";
//////////////////////
// main
//////////////////////
int main(int argc, char** argv)
{
double image_size = IMAGE_SIZE * IMAGE_CONVERTION;
long file_size = 0;
// IO files
ofstream out_file(out_string, ios::out | ios::binary);
ifstream in_file(in_string, ios::in | ios::binary);
// error cheking, like check n_frames+skip_frames overflow
//
// TODO
// image buffer
char* image = new char[(int)image_size];
// skip frames
in_file.seekg(skip_frames*image_size);
// read/write image buffer one by one
for(int i = 0; i < n_frames; i++)
{
in_file.read(image, image_size);
out_file.write(image, image_size);
}
// close the files
out_file.close();
in_file.close();
printf("Copy finished ...");
return 0;
}
//包含库
#包括
使用名称空间std;
#定义P420 1.5
常量int图像大小=1920*1080;//全高清图像大小(像素)
常量双映像_转换=P420;
int n_帧=300;//设置要复制的帧数
int skip_frames=500;//设置从输入文件开始跳过的帧数
字符串中的字符[]=“F:\\BigBucksBunny\\yuv\\BigBucksBunny\u 1920\u 1080\u 24fps.yuv”;
char out_string[]=“out.yuv”;
//////////////////////
//主要
//////////////////////
int main(int argc,字符**argv)
{
双图像大小=图像大小*图像转换;
长文件大小=0;
//IO文件
输出文件(输出字符串,ios::out | ios::binary);
_文件中的ifstream(在_字符串中,ios::in | ios::binary);
//错误检查,如检查n\u帧+跳过\u帧溢出
//
//待办事项
//图像缓冲区
字符*图像=新字符[(int)图像大小];
//跳帧
in_file.seekg(跳过帧*图像大小);
//逐个读取/写入图像缓冲区
对于(int i=0;i <代码> < p>这里是C++中的最小工作示例,如果有人会搜索一个简单的解决方案:
// include libraries
#include <fstream>
using namespace std;
#define P420 1.5
const int IMAGE_SIZE = 1920*1080; // ful HD image size in pixels
const double IMAGE_CONVERTION = P420;
int n_frames = 300; // set number of frames to copy
int skip_frames = 500; // set number of frames to skip from the begining of the input file
char in_string[] = "F:\\BigBucksBunny\\yuv\\BigBuckBunny_1920_1080_24fps.yuv";
char out_string[] = "out.yuv";
//////////////////////
// main
//////////////////////
int main(int argc, char** argv)
{
double image_size = IMAGE_SIZE * IMAGE_CONVERTION;
long file_size = 0;
// IO files
ofstream out_file(out_string, ios::out | ios::binary);
ifstream in_file(in_string, ios::in | ios::binary);
// error cheking, like check n_frames+skip_frames overflow
//
// TODO
// image buffer
char* image = new char[(int)image_size];
// skip frames
in_file.seekg(skip_frames*image_size);
// read/write image buffer one by one
for(int i = 0; i < n_frames; i++)
{
in_file.read(image, image_size);
out_file.write(image, image_size);
}
// close the files
out_file.close();
in_file.close();
printf("Copy finished ...");
return 0;
}
//包含库
#包括
使用名称空间std;
#定义P420 1.5
常量int图像大小=1920*1080;//全高清图像大小(像素)
常量双映像_转换=P420;
int n_帧=300;//设置要复制的帧数
int skip_frames=500;//设置从输入文件开始跳过的帧数
字符串中的字符[]=“F:\\BigBucksBunny\\yuv\\BigBucksBunny\u 1920\u 1080\u 24fps.yuv”;
char out_string[]=“out.yuv”;
//////////////////////
//主要
//////////////////////
int main(int argc,字符**argv)
{
双图像大小=图像大小*图像转换;
长文件大小=0;
//IO文件
输出文件(输出字符串,ios::out | ios::binary);
_文件中的ifstream(在_字符串中,ios::in | ios::binary);
//错误检查,如检查n\u帧+跳过\u帧溢出
//
//待办事项
//图像缓冲区
字符*图像=新字符[(int)图像大小];
//跳帧
in_file.seekg(跳过帧*图像大小);
//逐个读取/写入图像缓冲区
对于(int i=0;i
如果您有可用的,您可以使用此方法将每个帧存储为单独的文件:
src_yuv = open(self.filename, 'rb')
for i in xrange(NUMBER_OF_FRAMES):
data = src_yuv.read(NUMBER_OF_BYTES)
fname = "frame" + "%d" % i + ".yuv"
dst_yuv = open(fname, 'wb')
dst_yuv.write(data)
sys.stdout.write('.')
sys.stdout.flush()
dst_yuv.close()
src_yuv.close()
只需将大写的变量更改为有效数字,例如
一帧1080p的字节数应为1920*1080*3/2=3110400
或者,如果您安装cygwin,您可以使用dd
工具,例如获取1080p剪辑的第一帧,请执行以下操作:
dd bs=3110400 count=1 if=sample.yuv of=frame1.yuv
如果可用,可以使用此方法将每个帧存储为单独的文件:
src_yuv = open(self.filename, 'rb')
for i in xrange(NUMBER_OF_FRAMES):
data = src_yuv.read(NUMBER_OF_BYTES)
fname = "frame" + "%d" % i + ".yuv"
dst_yuv = open(fname, 'wb')
dst_yuv.write(data)
sys.stdout.write('.')
sys.stdout.flush()
dst_yuv.close()
src_yuv.close()
只需将大写的变量更改为有效数字,例如
一帧1080p的字节数应为1920*1080*3/2=3110400
或者,如果您安装cygwin,您可以使用dd
工具,例如获取1080p剪辑的第一帧,请执行以下操作:
dd bs=3110400 count=1 if=sample.yuv of=frame1.yuv
方法1:
如果您使用的是gstreamer,并且您只需要从大型yuv文件中获得前X个yuv帧,那么您可以使用下面的方法
gst-launch-1.0 filesrc num-buffers=X location="Your_large.yuv" ! videoparse width=x height=y format="xy" ! filesink location="FirstXframes.yuv"
方法2:
计算1帧的大小,然后使用split
实用程序将大文件划分为小文件
使用
方法1:
如果您使用的是gstreamer,并且您只需要从大型yuv文件中获得前X个yuv帧,那么您可以使用下面的方法
gst-launch-1.0 filesrc num-buffers=X location="Your_large.yuv" ! videoparse width=x height=y format="xy" ! filesink location="FirstXframes.yuv"
方法2:
计算1帧的大小,然后使用split
实用程序将大文件划分为小文件
使用