libyuv::YUY2ToNV12的使用demo
时间: 2024-01-06 13:06:14 浏览: 329
以下是使用 libyuv::YUY2ToNV12 进行图像转换的示例代码:
```cpp
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include "libyuv.h"
int main(int argc, char* argv[]) {
const char* src_filename = "input.yuy2";
const char* dst_filename = "output.nv12";
const int src_width = 640;
const int src_height = 480;
// 打开输入文件
FILE* src_file = fopen(src_filename, "rb");
if (!src_file) {
std::cerr << "Could not open source file: " << src_filename << std::endl;
return -1;
}
// 打开输出文件
FILE* dst_file = fopen(dst_filename, "wb");
if (!dst_file) {
std::cerr << "Could not open destination file: " << dst_filename << std::endl;
return -1;
}
// 准备输入帧
uint8_t* src_frame = (uint8_t*)malloc(src_width * src_height * 2);
// 准备输出帧
uint8_t* dst_y = (uint8_t*)malloc(src_width * src_height);
uint8_t* dst_uv = (uint8_t*)malloc(src_width * src_height / 2);
// 读取输入帧
if (fread(src_frame, 1, src_width * src_height * 2, src_file) != src_width * src_height * 2) {
std::cerr << "Could not read input frame" << std::endl;
return -1;
}
// 进行图像转换
libyuv::YUY2ToNV12(src_frame, src_width * 2, dst_y, src_width, dst_uv, src_width, src_width, src_height);
// 写入输出帧
if (fwrite(dst_y, 1, src_width * src_height, dst_file) != src_width * src_height) {
std::cerr << "Could not write output frame" << std::endl;
return -1;
}
if (fwrite(dst_uv, 1, src_width * src_height / 2, dst_file) != src_width * src_height / 2) {
std::cerr << "Could not write output frame" << std::endl;
return -1;
}
// 释放资源
fclose(src_file);
fclose(dst_file);
free(src_frame);
free(dst_y);
free(dst_uv);
return 0;
}
```
代码中的 YUY2ToNV12 图像转换使用了 libyuv 库进行实现。在代码中,我们首先打开输入文件和输出文件,并准备输入帧和输出帧的内存空间。然后,我们读取输入帧,进行图像转换,最后将输出帧写入输出文件。最后,我们释放资源并返回。注意,由于 NV12 格式中的 UV 分量是交错存储的,因此在写入输出文件时需要分别写入 Y 分量和交错的 UV 分量。
阅读全文