ffmpeg从AVFrame取出yuv数据到保存到char*中
2015-02-11 15:03
846 查看
ffmpeg从AVFrame取出yuv数据到保存到char*中
很多人一直不知道怎么利用ffmpeg从AVFrame取出yuv数据到保存到char*中,下面代码将yuv420p和yuv422p的数据取出并保存到char*buf中。其他格式可以自己去扩展,前提先看戏yuv的各种格式,yuv的各种格式链接:http://blog.csdn.net/zhuweigangzwg/article/details/17222535
//如果是视频 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(1,video_decode_size * 3 * 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 = 0 ; i < pstream_info->dec_ctx->height ; i++) { memcpy(video_decode_buf+pstream_info->dec_ctx->width*i, pDecodeFrame->data[0]+pDecodeFrame->linesize[0]*i, pstream_info->dec_ctx->width); } for(j = 0 ; j < pstream_info->dec_ctx->height/2 ; j++) { memcpy(video_decode_buf+pstream_info->dec_ctx->width*i+pstream_info->dec_ctx->width/2*j, pDecodeFrame->data[1]+pDecodeFrame->linesize[1]*j, pstream_info->dec_ctx->width/2); } for(k =0 ; k < pstream_info->dec_ctx->height/2 ; k++) { memcpy(video_decode_buf+pstream_info->dec_ctx->width*i+pstream_info->dec_ctx->width/2*j+pstream_info->dec_ctx->width/2*k, pDecodeFrame->data[2]+pDecodeFrame->linesize[2]*k, pstream_info->dec_ctx->width/2); } } else if (pstream_info->dec_ctx->pix_fmt == AV_PIX_FMT_YUV422P)//如果是yuv422p的 { for(i = 0 ; i < pstream_info->dec_ctx->height ; i++) { memcpy(video_decode_buf+pstream_info->dec_ctx->width*i, pDecodeFrame->data[0]+pDecodeFrame->linesize[0]*i, pstream_info->dec_ctx->width); } for(j = 0 ; j < pstream_info->dec_ctx->height ; j++) { memcpy(video_decode_buf+pstream_info->dec_ctx->width*i+pstream_info->dec_ctx->width/2*j, pDecodeFrame->data[1]+pDecodeFrame->linesize[1]*j, pstream_info->dec_ctx->width/2); } for(k =0 ; k < pstream_info->dec_ctx->height ; k++) { memcpy(video_decode_buf+pstream_info->dec_ctx->width*i+pstream_info->dec_ctx->width/2*j+pstream_info->dec_ctx->width/2*k, pDecodeFrame->data[2]+pDecodeFrame->linesize[2]*k, pstream_info->dec_ctx->width/2); } } 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 = 0; frame_info->timebase_den = 0; frame_info->timebase_num = 0; frame_info->bufsize = 0; memset(frame_info->buf,0,MAX_FRAME_SIZE); } if (video_decode_buf) { free(video_decode_buf); video_decode_buf = NULL; } video_decode_size = 0; }
交流请加QQ群:62054820
QQ:379969650
相关文章推荐
- ffmpeg从AVFrame取出yuv数据到保存到char*中
- ffmpeg获取摄像头数据保存成YUV420P格式
- ffmpeg最简单的解码保存YUV数据
- ffmpeg解码数据保存为yuv格式
- 从ffmpeg中取出YUV数据
- FFmpeg-利用ffplay.c保存视频解码后的数据yuv420
- ffmpeg中avframe的YUV格式数据到OpenCV中Mat的BGR格式转换
- ffmpeg最简单的解码保存YUV数据
- ffmpeg最简单的解码保存YUV数据
- ffmpeg最简单的解码保存YUV数据 <转>
- 通过FFmpeg将多媒体文件解码后保存成Bmp图像(YUV420 RGB32)
- 使用NSUserDefaults保存、取出和更新数据
- ffmpeg 新旧版本AVFrame中data的yuv颠倒
- FFMPEG 实现 YUV,RGB各种图像原始数据之间的转换(swscale)
- AVFrame数据转RGB或YUV
- ffmpeg Windows下采集摄像头一帧数据,并保存为bmp图片
- 使用ffmpeg将BMP图片编码为x264视频文件,将H264视频保存为BMP图片,yuv视频文件保存为图片的代码
- ffmpeg Windows下采集摄像头一帧数据,并保存为bmp图片
- ffmpeg Windows下采集摄像头一帧数据,并保存为bmp图片
- mongodb - 前端form表单传递数据,在保存和取出的数据格式处理函数 - 非递归