ffmpeg从AVFrame取出yuv数据到保存到char*中
ffmpeg从AVFrame取出yuv数据到保存到char*中
- out_buffer=(uint8_t *)av_malloc(avpicture_get_size(PIX_FMT_YUV420P, pCodecCtx->width, pCodecCtx->height));//分配AVFrame所需内存
- avpicture_fill((AVPicture *)pFrameYUV, out_buffer, PIX_FMT_YUV420P, pCodecCtx->width, pCodecCtx->height);//填充AVFrame
- img_convert_ctx = sws_getContext(pCodecCtx->width, pCodecCtx->height, pCodecCtx->pix_fmt,
- pCodecCtx->width, pCodecCtx->height, PIX_FMT_YUV420P, SWS_BICUBIC, NULL, NULL, NULL);
- //如果是视频
- else if (pstream_info[i].dec_ctx->codec_type == AVMEDIA_TYPE_VIDEO)
- {
- int new_videosize = pkt.size;
- int video_decode_size = avpicture_get_size(pstream_info->dec_ctx->pix_fmt, Zoom_Width,Zoom_Height);
- uint8_t * video_decode_buf =( uint8_t *)calloc(,video_decode_size * * sizeof(char)); //最大分配的空间,能满足yuv的各种格式
- // Decode video frame
- avcodec_decode_video2(pstream_info->dec_ctx, pDecodeFrame, &frameFinished,&pkt);
- if(frameFinished)
- {
- if (pstream_info->dec_ctx->pix_fmt == AV_PIX_FMT_YUV420P) //如果是yuv420p的
- {
- for(i = ; i < pstream_info->dec_ctx->height; i++)
- {
- memcpy(video_decode_buf+pstream_info->dec_ctx->width*i,
- pDecodeFrame->data[]+pDecodeFrame->linesize[]*i,
- pstream_info->dec_ctx->width);
- }
- for(j = ; j < pstream_info->dec_ctx->height/; j++)
- {
- memcpy(video_decode_buf+pstream_info->dec_ctx->width*i+pstream_info->dec_ctx->width/*j,
- pDecodeFrame->data[]+pDecodeFrame->linesize[]*j,
- pstream_info->dec_ctx->width/);
- }
- for(k =; k < pstream_info->dec_ctx->height/; k++)
- {
- memcpy(video_decode_buf+pstream_info->dec_ctx->width*i+pstream_info->dec_ctx->width/*j+pstream_info->dec_ctx->width/*k,
- pDecodeFrame->data[]+pDecodeFrame->linesize[]*k,
- pstream_info->dec_ctx->width/);
- }
- }
- else if (pstream_info->dec_ctx->pix_fmt == AV_PIX_FMT_YUV422P)//如果是yuv422p的
- {
- for(i = ; i < pstream_info->dec_ctx->height; i++)
- {
- memcpy(video_decode_buf+pstream_info->dec_ctx->width*i,
- pDecodeFrame->data[]+pDecodeFrame->linesize[]*i,
- pstream_info->dec_ctx->width);
- }
- for(j = ; j < pstream_info->dec_ctx->height; j++)
- {
- memcpy(video_decode_buf+pstream_info->dec_ctx->width*i+pstream_info->dec_ctx->width/*j,
- pDecodeFrame->data[]+pDecodeFrame->linesize[]*j,
- pstream_info->dec_ctx->width/);
- }
- for(k =; k < pstream_info->dec_ctx->height; k++)
- {
- memcpy(video_decode_buf+pstream_info->dec_ctx->width*i+pstream_info->dec_ctx->width/*j+pstream_info->dec_ctx->width/*k,
- pDecodeFrame->data[]+pDecodeFrame->linesize[]*k,
- pstream_info->dec_ctx->width/);
- }
- }
- else
- {
- //可扩展
- }
- video_decode_size = avpicture_get_size(pstream_info->dec_ctx->pix_fmt, pstream_info->dec_ctx->width,pstream_info->dec_ctx->height);
- new_videosize = video_decode_size;
- //缩放或格式转换
- if (pstream_info->dec_ctx->width != Zoom_Width ||
- pstream_info->dec_ctx->height != Zoom_Height ||
- pstream_info->dec_ctx->pix_fmt != Zoom_pix_fmt)
- {
- new_videosize = VideoScaleYuvZoom(Is_flip,pstream_info->dec_ctx->width ,pstream_info->dec_ctx->height,(int)pstream_info->dec_ctx->pix_fmt,
- Zoom_Width,Zoom_Height,Zoom_pix_fmt,video_decode_buf);
- }
- //这里可以取出数据
- frame_info->stream_idx = pstream_info->stream_idx;
- //frame_info->pts = pDecodeFrame->pkt_pts * 1000 * av_q2d(pstream_info->stream->time_base); //转化成毫秒
- frame_info->pts = pDecodeFrame->pkt_pts;
- frame_info->timebase_den = pstream_info->stream->time_base.den;
- frame_info->timebase_num = pstream_info->stream->time_base.num;
- frame_info->bufsize = new_videosize;
- memcpy(frame_info->buf,video_decode_buf,new_videosize);
- }
- else
- {
- //缓存
- frame_info->stream_idx = pstream_info->stream_idx;
- frame_info->pts = ;
- frame_info->timebase_den = ;
- frame_info->timebase_num = ;
- frame_info->bufsize = ;
- memset(frame_info->buf,,MAX_FRAME_SIZE);
- }
- if (video_decode_buf)
- {
- free(video_decode_buf);
- video_decode_buf = NULL;
- }
- video_decode_size = ;
- }
也可以把YUV数据进行存储为PPM格式(Linux系统下的图片格式):
- //如果是视频
- else if (pstream_info[i].dec_ctx->codec_type == AVMEDIA_TYPE_VIDEO)
- {
- // Decode video frame
- avcodec_decode_video2(pstream_info->dec_ctx, pDecodeFrame, &frameFinished,&pkt);
- if(frameFinished)
- {
- sws_scale(img_convert_ctx, (const uint8_t* const*)pFrame->data, pFrame->linesize, , pCodecCtx->height, pFrameYUV->data, pFrameYUV->linesize);
- if((++k<=) && (k%==)) {
- SaveFrame(pFrameYUV, pCodecCtx->width, pCodecCtx->height, k);
- }
- }
- }
- void SaveFrame(AVFrame *pFrame, int width, int height, int iFrame)
- {
- FILE *pFile;
- char szFilename[];
- int y;
- SDL_Log("%d * %d", width, height);
- // Open file
- sprintf(szFilename, "frame/frame%d.ppm", iFrame);
- pFile=fopen(szFilename, "wb");
- if(pFile==NULL)
- return;
- // Write header
- fprintf(pFile, "P6\n%d %d\n255\n", width, height);
- // Write pixel data
- for(y=; y<height; y++) {
- fwrite(pFrame->data[]+y*pFrame->linesize[], , width*, pFile);
- }
- // Close file
- fclose(pFile);
- }
ffmpeg从AVFrame取出yuv数据到保存到char*中的更多相关文章
- python 数据如何保存到excel中--xlwt
第一步:下载xlwt 首先要下载xlwt,(前提是你已经安装好了Python) 下载地址: https://pypi.python.org/pypi/xlwt/ 下载第二个 第二步:安装xl ...
- (转) 从ffmpeg中提取出YUV数据
有时需要从ffmpeg中提取出YUV数据用作预览,另存什么的. ffmpeg是先解码成YUV, 再以这个YUV作为输入进行编码,所以YUV数据有两种: 解码后的YUV数据, 以及 编码重建的YUV ...
- 1.scrapy爬取的数据保存到es中
先建立es的mapping,也就是建立在es中建立一个空的Index,代码如下:执行后就会在es建lagou 这个index. from datetime import datetime fr ...
- c# 抓取和解析网页,并将table数据保存到datatable中(其他格式也可以,自己去修改)
使用HtmlAgilityPack 基础请参考这篇博客:https://www.cnblogs.com/fishyues/p/10232822.html 下面是根据抓取的页面string 来解析并保存 ...
- Redis使用场景一,查询出的数据保存到Redis中,下次查询的时候直接从Redis中拿到数据。不用和数据库进行交互。
maven使用: <!--redis jar包--> <dependency> <groupId>redis.clients</groupId> < ...
- Android把图片保存到SQLite中
1.bitmap保存到SQLite 中 数据格式:Blob db.execSQL("Create table " + TABLE_NAME + "( _id INTEGE ...
- 【redis,1】java操作redis: 将string、list、map、自己定义的对象保存到redis中
一.操作string .list .map 对象 1.引入jar: jedis-2.1.0.jar 2.代码 /** * @param args */ public s ...
- 将数字n转换为字符串并保存到s中
将数字n转换为字符串并保存到s中 参考 C程序设计语言 #include <stdio.h> #include <string.h> //reverse函数: 倒置字符串s中各 ...
- Flask实战第43天:把图片验证码和短信验证码保存到memcached中
前面我们已经获取到图片验证码和短信验证码,但是我们还没有把它们保存起来.同样的,我们和之前的邮箱验证码一样,保存到memcached中 编辑commom.vews.py .. from utils i ...
随机推荐
- phpcms流程
phpcms流程1: 安装 将下载好的文件放到www目录下 地址栏中输入 http://localhost/phpcms/install_package/install 打开安装页面 进行安装即可. ...
- yii框架分页
- 关于echarts的疑问
echarts-例子--待解决:模拟迁徙里面的 var planePath = 'path://M1705.06,1318.313v-89.254l-319.9-221.799l0.073-208.0 ...
- TCP 长连接与短连接的区别
TCP连接 当网络通信时采用TCP协议时,在真正的读写操作之前,server与client之间必须建立一个连接,当读写操作完成后,双方不再需要这个连接时它们可以释放这个连接,连接的建立是需要三次握手的 ...
- Android-Activity使用(1)
一.添加 activity类 Aty1 继承Activity package activitylc.eoe.cn.l002activieylc; import android.app.Activit ...
- 两种方法解决tomcat的 Failed to initialize end point associated with ProtocolHandler ["http-apr-8080"]
出现这种原因主要是8080端口被占用了. 解决1: 打开任务管理器看看里面有没有javaw的线程,把它关了再重新启动tomcat看看. 解决2: 修改tomcat /conf /server.xml ...
- 服务器IP地址后修改SQL Server配置
1. 修改TCP/IP 属性的IP 地址 修改该实例的协议.修改TCP/IP协议的属性,将IP地址更新为当前的最新IP 地址.然后重启该实例. 2.查看全部侦听再检查SQL Server 实例的TCP ...
- AJAX-----14HTML5中新增的API---files
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- swift uiview弹出动画
UIView.animateWithDuration(0.5, delay: 0.0, usingSpringWithDamping: 0.3, initialSpringVelocity: 0.0, ...
- wex5 教程 之 图文讲解 bind-css和bind-sytle的异同
wex5作为网页开发利器,在前台UI数据交互设计中大量使用了绑定技术,即官方视频教学中也提到了KO,实质是数据绑定与追踪.在前台组件的属性中,为我们提供了两个重要的样式绑定属性,bind-css和bi ...