uv422转换为yuv420_利用libswscale转换yuyv422到yuv422p或rgb之间的转换, 视频翻转
yuyv422的数据来自ffdshow raw filter输出的yuv2, 其实就是yuv422p的packed模式, 要转成planar模式。
对原始颜色空间的文件不确定是不是你想的那种颜色空间的话请先用ffplay播放一下看看正不正确,ffplay支持的颜色空间可以通过:
//视频
ffplay -pix_fmts
//音频
ffplay -sample_fmts 来查看支持的格式, 播放可通过:
ffplay -framerate 25 -pixel_format yuyv422 -video_size 640x480 -i yuy2.yuv
如果播放出来的效果跟你想的一样那就对了。
由于yuv颜色空间各种名称各种规格多的莫名其妙,根据yuv的比例主要422、420、444三种, 排列格式有packed和planar,packed就是只要一个指针指向数据就行了, 而planar需要三个指针分别指向y、u、v的地址。 yuv420 planar的比如I420,YV12, 其实两者关系就是u和v的位置互换而已。 算了越说越糊涂。
转换用大家都喜欢的libswscale, 说实在的这东西光看头文件容易犯晕。 直接上代码:
void ConvertYUYV2ToYUV422P()
{
int w = 640;
int h = 480;
uint8_t *in_buf = new uint8_t[614400 + 4];
uint8_t *out_buf = new uint8_t[614400 + 4];
//auto m_av_input_frame = avcodec_alloc_frame();
//auto m_av_output_frame = avcodec_alloc_frame();
//auto aia_in = av_image_alloc(m_av_input_frame->data, m_av_input_frame->linesize,
//w, h, PIX_FMT_YUYV422, 1);
//auto aia_out = av_image_alloc(m_av_output_frame->data, m_av_output_frame->linesize,
//w, h, PIX_FMT_YUV422P, 1);
AVPicture m_av_input_pic;
AVPicture m_av_output_pic;
auto one_yuy2_size = avpicture_get_size(PIX_FMT_YUYV422, w, h);
auto one_yuv422p_size = avpicture_get_size(PIX_FMT_YUV422P, w, h);
//avpicture_alloc(&m_av_input_pic, PIX_FMT_YUYV422, w, h);
avpicture_alloc(&m_av_output_pic, PIX_FMT_YUV422P, w, h);
std::fstream input_file, output_file;
input_file.open("e:\\640_480_yuy2.yuv", std::ios_base::in | std::ios_base::binary);
output_file.open("e:\\640_480_yuv422p.yuv", std::ios_base::out | std::ios_base::binary);
auto s_input = sws_isSupportedInput(PIX_FMT_YUYV422);
auto s_output = sws_isSupportedOutput(PIX_FMT_YUYV422);
auto sws_ct = sws_getCachedContext(NULL,
w, h, PIX_FMT_YUYV422,
w, h, PIX_FMT_YUV422P,
SWS_BILINEAR, NULL, NULL, NULL);
while (!input_file.eof()) {
input_file.read((char *)in_buf, one_yuy2_size);
auto rel_size = input_file.gcount();
if (rel_size != one_yuy2_size) break;
auto fill_size = avpicture_fill(&m_av_input_pic, in_buf, PIX_FMT_YUYV422, w, h);
auto sws_rel = sws_scale(sws_ct, m_av_input_pic.data, m_av_input_pic.linesize, 0, h,
m_av_output_pic.data, m_av_output_pic.linesize);
auto layout_rel = avpicture_layout(&m_av_output_pic, PIX_FMT_YUV422P, w, h, out_buf, 614404);
AtlTrace("Fill PIX_FMT_YUY2, Size:[%d], sws_scale return:[%d], layout return:[%d]\n",
fill_size, sws_rel, layout_rel);
output_file.write((char *)out_buf, layout_rel);
}
input_file.close();
output_file.close();
//av_free(m_av_input_frame->data[0]);
//av_free(m_av_input_frame);
//av_free(m_av_output_frame->data[0]);
//av_free(m_av_output_frame);
//avpicture_free(&m_av_input_pic);
avpicture_free(&m_av_output_pic);
sws_freeContext(sws_ct);
delete [] in_buf;
delete [] out_buf;
}
注释掉的那几行可以完全删除, 那只是我走的弯路。 至于sws_getCachedContext为什么要 SWS_BILINEAR, 我翻了翻libswscale的代码, 写的太逆天了我就不深究了。
//2012-11-15 添加 翻转
代码来自[这里]
void FlipFrame(AVFrame* pFrame)
{
for (int i = 0; i < 4; i++) {
pFrame->data[i] += pFrame->linesize[i] * (pFrame->height-1);
pFrame->linesize[i] = -pFrame->linesize[i];
}
}
void FlipAVPicture(AVPicture* pFrame, int height)
{
for (int i = 0; i < 4; i++) {
pFrame->data[i] += pFrame->linesize[i] * (height-1);
pFrame->linesize[i] = -pFrame->linesize[i];
}
}
uv422转换为yuv420_利用libswscale转换yuyv422到yuv422p或rgb之间的转换, 视频翻转相关推荐
- 利用libswscale转换yuyv422到yuv422p或rgb之间的转换, 视频翻转
2019独角兽企业重金招聘Python工程师标准>>> yuyv422的数据来自ffdshow raw filter输出的yuv2, 其实就是yuv422p的packed模式, 要转 ...
- android图片转换为二进制流,Android图片二进制与Bitmap、Drawable之间的转换
Android图片二进制与Bitmap.Drawable之间的转换 Java代码 public byte[] getBitmapByte(Bitmap bitmap){ ByteArrayOutput ...
- vue将json字符串转换为数组_json字符串、json对象、数组 三者之间的转换
var Obj = JOSN.parse("cscac"); //将JSON字符串转换成JSON对象 var "cscac" = JSON.stringify( ...
- wgs84坐标系转换工具_ArcGIS中不同坐标系之间的转换
用户经常会遇到这样的情况,现有的数据坐标不符合要求,为应对需求,不得不为数据转换坐标系.很多人认为转换坐标系只是单纯的使用工具箱中的[投影]工具,那就大错特错了.有很多情况下,只使用[投影]工具并不能 ...
- 数的进制转换(任意两个进制之间的转换)
编写一个程序,可以实现将一个数字由一个进制转换为另一个进制. 这里有62个不同数位{0-9,A-Z,a-z}. 输入格式 第一行输入一个整数,代表接下来的行数. 接下来每一行都包含三个数字,首先是输入 ...
- HSV与HSI颜色空间的区别以及和RGB之间的转换
Gonzalez的Digital Image Processing中介绍了HSI颜色空间,以其中的圆锥模型为例 HSI(也称为HSL(Lightness))和HSV的区别可以这样理解 最本质的区别是V ...
- python 自定义进制转换_[python]从零开始学python——颜色的16进制于RGB之间的转换...
在学习openstack的时候,发现openstack是python开发的:学习mininet自定义拓扑,发现mininet是python开发的:看看ryu,还是python开发的--于是心中升起了自 ...
- 最简单的基于FFmpeg的libswscale的示例(YUV转RGB)
===================================================== 最简单的基于FFmpeg的libswscale的示例系列文章列表: 最简单的基于FFmpeg ...
- html进制转换js代码,JS中的进制转换以及作用
js的进制转换, 分为2进制,8进制,10进制,16进制之间的相互转换, 我们直接利用 对象.toString()即可实现: 运行下面代码 //10进制转为16进制 (10).toString(16) ...
- 计算机网络ip进制转换方法,IP地址与二进制之间的转换
IP地址与二进制之间的转换 在讨论如何进行IP地址与二进制之间的转换前, 有必要解释一下IP地址与二进制的概念 IP IP协议是网络层的一个协议, 是能使连接到网上的所有计算机网络实现相互通信的一套规 ...
最新文章
- 《C++primer》第二章--变量和基本内置类型
- C++中string查找和取子串和整形转化
- “libc++_shared.so“ not found 解决
- 江苏省对口单招计算机原理,江苏省对口单招计算机原理教案.doc
- Transformer升级之路:博采众长的旋转式位置编码
- 未付服务网关限流作用
- Leet Code OJ 217. Contains Duplicate [Difficulty: Easy]
- 游戏必备组件有哪些_面试必备:2019Vue经典面试题总结(含答案)
- C# ADO.NET
- python pdfminer解析pdf文件的每一行,得到每一行的坐标与每个字符的坐标
- kafka 重新分配partition
- 神经网络如何提高准确率,神经网络的求解方式
- 股市最好用的大数据软件_炒股软件app哪个最好用?老股民说你有这个就够了
- 未来教育计算机书,未来教育计算机二级
- 2020-10-13 用JavaScript做的贪吃蛇小游戏
- “汇新杯”科技+社会公益专项赛介绍
- 细胞生物学-7-叶绿体和线粒体
- linux定时任务生效_linux设置定时任务
- linux device 与driver prove 过程
- Vue项目axios在IE浏览器报promise错误的解决办法