ffmpeg 库yuv420转jpeg(内存)

ffmpeg 库yuv420转jpeg近来实现mjpeg的http实时流,需要yuv420转jpeg。了解了一下主要可以通过ffmpeg或者libjpeg(terbo)实现。 现想用ffmpeg,网上搜了一下,资料不多。比较热门的是雷神的博客: http://blog.csdn.net/leixiaohua1020/article/details/25346147 但有个问题,例子是写文件的,
摘要由CSDN通过智能技术生成

ffmpeg 库yuv420转jpeg(内存)

近来实现mjpeg的http实时流,需要yuv420转jpeg。了解了一下主要可以通过ffmpeg或者libjpeg(terbo)实现。
现想用ffmpeg,网上搜了一下,资料不多。比较热门的是雷神的博客:
http://blog.csdn.net/leixiaohua1020/article/details/25346147
但有个问题,例子是写文件的,使用到AVFormatContext,封装好的读写,没法从内存里搞出来。
自己对ffmpeg也是小白一个,只能慢慢查找资料研究。解决方法是自己定义AVCodecContext。

pCodecCtx = avcodec_alloc_context3(pCodec);

这样总算能拿到编码后的buff了。但还有一个问题,在调试雷神的demo的时候发现编码后的图片明显有颜色的差别。
编码前编码后

一开始以为是质量的问题,找了很久也没发现哪里可以调质量(有人知道请告诉我一声)
后来一想不太对,ffmpeg中jpeg编码输入要求YUVJ420P。但YUVJ420PYUV420P是不一样的,他们的range有大有小。参考https://en.wikipedia.org/wiki/YUV
雷神的例子中直接把YUV420P当成YUVJ420P编码可能存在颜色出错。所以解决方法就是
1.YUV420P to YUVJ420P
2.YUVJ420P to jpeg

最终加上YUV420P 转 YUVJ420P的代码就可以了。
完整的代码如下,可下载雷神的demo修改:

extern "C"
{
#include "libavutil/imgutils.h"
#include "libswscale/swscale.h"  
};
int main(int argc, char* argv[])
{
    AVCodec *pCodec;
    AVCodecContext *pCodecCtx = NULL;
    int i, ret, got_output;
    FILE *fp_in;
    FILE *fp_out;
    
  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
FFmpeg是一个开源的跨平台音视频处理工具,提供了丰富的功能和,可以用于音视频的编解码、换、处理等操作。 JPEG是一种常见的图像压缩格式,而YUV是一种颜色编码格式。YUV444和YUV420都是YUV的子格式,它们之间的区别在于色度分量的采样方式不同。 YUV444表示每个像素的亮度(Y)、红色差(U)和蓝色差(V)都有完整的采样,即每个像素都有对应的YUV值。而YUV420则是一种更为常见的格式,它采用了色度分量的降采样,即对于每4个像素只有一个U和一个V值,而亮度Y值则保持不变。 要将YUV444换为YUV420,可以使用FFmpeg提供的命令行工具或者API进行处理。具体步骤如下: 1. 打开输入文件:使用avformat_open_input函数打开输入文件。 2. 获取输入流信息:使用avformat_find_stream_info函数获取输入流的相关信息。 3. 创建输出上下文:使用avformat_alloc_output_context2函数创建输出上下文。 4. 添加输出流:使用avformat_new_stream函数创建输出流,并设置相关参数。 5. 打开输出文件:使用avio_open函数打开输出文件。 6. 写入文件头:使用avformat_write_header函数写入输出文件的文件头。 7. 读取输入帧:使用av_read_frame函数读取输入文件的帧数据。 8. 换帧数据:使用sws_scale函数将YUV444的帧数据换为YUV420的帧数据。 9. 写入输出帧:使用av_interleaved_write_frame函数将换后的帧数据写入输出文件。 10. 释放资源:关闭输入输出文件,释放相关资源。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值