Image processing 从大型YUV文件中提取一些YUV帧

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++编写,如果

我正在寻找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++编写,如果有人会搜索一个简单的解决方案:

// 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
实用程序将大文件划分为小文件

使用