只贴出部分代码,重在说明过程。

与解码文件的大致过程类似,只不过自定义了AVFormatContextstruct IOData{char* data;size_t len;};int FrVideoAcqHT::io_get_data(void *opaque, uint8_t *buf, int buf_size)
{FrVideoAcqHT* acq = (FrVideoAcqHT*)opaque;//以下为通过缓冲区读文件解码方式/*if (!feof(acq->f)){int true_size = fread(buf, 1, 1024, acq->f);printf("read:%d\n", true_size);return true_size;}else{printf("read failed\n");return -1;}*///不断读取数据while (true){IOData data;if (acq->data_queue.Pop(data)){memcpy(buf, data.data, data.len);return data.len;}else{Sleep(1000);}}}av_register_all();AVFormatContext* fctx = avformat_alloc_context();
av_buf = av_malloc(AV_IO_BUF_LEN);
avio = avio_alloc_context((uchar*)av_buf, AV_IO_BUF_LEN, 0, this, io_get_data, NULL, NULL);
fctx->pb = avio;err = avformat_open_input(&fctx, "none", NULL, NULL);printf("open input:%d\n", err);err = avformat_find_stream_info(fctx, NULL);printf("find stream info:%d, streams:%d\n", err, fctx->nb_streams);int video_id = -1;
for (int i = 0; i < fctx->nb_streams; i++)    //区分视频流和音频流
{if (fctx->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO) //找到视频流,这里也可以换成音频{video_id = i;break;}
}printf("video_id:%d\n", video_id);AVCodec* codec = avcodec_find_decoder(fctx->streams[video_id]->codec->codec_id);
AVCodecContext* cctx = fctx->streams[video_id]->codec;
err = avcodec_open2(cctx, codec, NULL);    // 打开解码器printf("open codec:%d\n", err);int width = cctx->width;
int height = cctx->height;printf("width:%d, height:%d\n", width, height);AVRational frame_rate = fctx->streams[video_id]->r_frame_rate;AVPicture pc;
AVPicture* pic = &pc;
avpicture_alloc(pic, PIX_FMT_RGB24, width, height);
AVFrame* frame = av_frame_alloc();SwsContext* sctx = sws_getContext(width, height, cctx->pix_fmt, width, height, (PixelFormat)PIX_FMT_BGR24, SWS_BICUBIC, NULL, NULL, NULL);IplImage* img = cvCreateImageHeader(cvSize(width, height), IPL_DEPTH_8U, 3);
img->imageSize = pic->linesize[0];
img->imageData = (char *)pic->data[0];int id = 0;
AVPacket* pck = new AVPacket;
while (av_read_frame(fctx, pck) >= 0)
{if (pck->stream_index == video_id){int got;err = avcodec_decode_video2(cctx, frame, &got, pck);if (err < 0){printf("decode err:%d\n", err);return;}if (got){printf("got img:%d\n", id);sws_scale(sctx, frame->data, frame->linesize, 0, height, pic->data, pic->linesize);char fname[100];sprintf(fname, "./img/%d.jpg", id);cvSaveImage(fname, img);id++;}}
}

ffmpeg解码内存缓冲区相关推荐

  1. ffmpeg解码内存中的数据

    需求 最近做一个项目需要播放一些简单的音频,而这些音频以二进制的形式存储在数据库中.而且需要保证音频的音频播放的实时性.故研究下如何从内存数据中解码音频. 开发 原帖中给的代码已经十分详细了.不过有几 ...

  2. FFmpeg解码内存G711A

    背景 最近从FFmpeg中学习了音频解码相关的知识,刚好做了音频G711A解码的工作,特此记录分享. 功能描述 我的需求是解码一帧帧的音频G711A的数据,所以我是从内存中取一帧完整的G711A音频数 ...

  3. ffmpeg 解码视频(h264、mpeg2)输出yuv420p文件

    ffmpeg 解码视频(h264.mpeg2)输出yuv420p文件 播放yuv可以参考:ffplay -pixel_format yuv420p -video_size 768x320 -frame ...

  4. ffmpeg 解码音频(aac、mp3)输出pcm文件

    ffmpeg 解码音频(aac.mp3)输出pcm文件 播放pcm可以参考: ffplay -ar 48000 -ac 2 -f f32le out.pcm main.c #include <s ...

  5. ffmpeg解码流程 turorial5详解

    From: http://www.360doc.com/content/11/1117/09/8050095_165108638.shtml FFMPEG解码流程 1. 注册所有容器格式和CODEC: ...

  6. 用surfaceview播放FFmpeg解码视屏

    关于FFmpeg解码请看第一篇教程:FFmpeg解码 下载转码库libyuv 一般我们用surfaceview播放视频都是才用RGBA格式等播放的,但我们解码之后的视频可能是h.264等等 所以我们这 ...

  7. 如何发送和接收RTP封包的H264,用FFmpeg解码

    这篇文章给大家介绍怎么打包H264分片到RTP包,并且实现一个播放程序演示接收RTP包和用FFmpeg解码.为了让大家更了解H264打包成RTP的细节,有必要罗嗦一下向大家介绍一些相关的基础知识,下面 ...

  8. ffmpeg解码视频文件并播放

    最近学习了一下如何使用ffmpeg解码音视频,网上的教程挺多但是也挺杂的,搞了好几天,明白了ffmpeg解码音视频的大体流程,这里记录一下ffmpeg解码视频并播放音视频的例子,但并没有做音频.视频播 ...

  9. 【Qt+FFmpeg】 - FFmpeg解码详细流程

    目录 一:视频解码流程 二:FFMPEG解码流程 三:FFmpeg解码函数 四:FFmpeg解码的数据结构 五:FFmpeg数据结构简介 六:FFmpeg数据结构分析 七:像素数据转换 八:FFMPE ...

最新文章

  1. C#中的非托管资源释放(FinalizeDispose)
  2. 查看MySQL服务端版本
  3. 洛谷P1082 同余方程 数论
  4. js中cookie操作
  5. 移动开发利器——APICloud开发平台介绍
  6. 时间序列预测入门必读的4篇论文
  7. MYSQL单列索引和组合索引分析
  8. Eplan 2.7 ”没有可用加密狗“问题
  9. 计算机安全审计技术工作总结,计算机安全审计技术研究
  10. hsqldb user lacks privilege or object not found
  11. ES报错处理-mapper [xx.xx] of different type, current_type [text], merged_type [keyword]
  12. OSPF路由器类型 ABR与ASBR路由聚合区别
  13. UI设计中置灰功能总结
  14. 鹏业安装云算量免费使用,只需这几步
  15. 一个简体/繁体字在线转换工具源码
  16. 写在2021最后一天
  17. undefined reference to symbol ‘dlsym@@GLIBC_2.4‘ 解决
  18. PHP快速入门-基础语法及面向对象
  19. python四大器_Python程序库中的四大天王
  20. JAVA Spring 事务管理事务不回滚问题

热门文章

  1. 把一块钱换成1分2分5分的硬币,有多少种方法?
  2. 智能识别系统---基于颜色直方图的相似目标查找(图像去噪,MeanShift匹配目标)
  3. Solving environment: failed with initial frozen solve.
  4. 二分查找算法基本思想
  5. 动手学Excel数据分析与可视化--数据分析简介
  6. element-plus组件库快速上手教程
  7. 13 facebook 国外面试
  8. 【双子真经】详解五种不同周期的双子——双子巨蟹座(6/19-6/24)
  9. linux-rockchip-电池相关
  10. Unity3D学习 ② 物体的正常跳跃、二段跳、冲刺