之前的设备研发算是告一段落了,最近一直在忙视频监控平台的架构以及实现,想把自己的设备接到自己的平台里,设备上的码流是ps流,要在平台里解码ps流->解码成h264->yuv->rgb最终显示。貌似现在用的最多的解码就是开源的ffmpeg,我也尝试着去研究ffmpeg,当然也只在网上搜搜资料看看如何调用这些,但好像都是些先探测流信息,然后再找解码器那些,但我并不想探测流,因为我已经知道流的格式了(这样也能节省探测时间),经过这段时间的不懈努力,终于搞出来了,现贴出部分代码以及demo

void PSDecode::startup()
{av_register_all();
}bool PSDecode::open()
{m_pCodec = avcodec_find_decoder(CODEC_ID_H264);if (!m_pCodec){return false;}m_pContext = avcodec_alloc_context3(m_pCodec);if (avcodec_open(m_pContext, m_pCodec) < 0){av_free(m_pContext);m_pContext = NULL;m_pCodec = NULL;}m_pFrame = avcodec_alloc_frame();m_pPicture = new AVPicture();memset(m_pPicture, 0, sizeof(AVPicture));return true;
}void PSDecode::close()
{if (!m_pContext){return;}av_free(m_pFrame);m_pFrame = NULL;avpicture_free(m_pPicture);delete m_pPicture;m_pPicture = NULL;closeScaleContext();avcodec_close(m_pContext);av_free(m_pContext);m_pContext = NULL;m_pCodec = NULL;}bool PSDecode::inputData(const unsigned char* buffer, size_t length)
{AVPacket packet;av_init_packet(&packet);packet.data = (unsigned char*)buffer;packet.size = length;int got_picture = 0;int ret = avcodec_decode_video2(m_pContext, m_pFrame, &got_picture, &packet);if (got_picture){updateResolution();drawFrame();m_frameCount ++;}return (ret >= 0);
}bool PSDecode::snap(const char* filename)
{FILE* pFile = fopen(filename, "wb");if (!pFile){return false;}int width = m_pContext->width;int height = m_pContext->height;AVPicture picture;memset(&picture, 0, sizeof(picture));avpicture_alloc(&picture, PIX_FMT_RGB32, width, height);SwsContext* pScaleContext = sws_getContext(width, height,m_pContext->pix_fmt,width, height, PIX_FMT_RGB32, SWS_BILINEAR, 0, 0, 0);sws_scale(pScaleContext, m_pFrame->data, m_pFrame->linesize, 0, height,picture.data, picture.linesize);sws_freeContext(pScaleContext);BITMAPINFO bmpInfo;memset(&bmpInfo, 0, sizeof(bmpInfo));bmpInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);bmpInfo.bmiHeader.biWidth = width;bmpInfo.bmiHeader.biHeight = - height;bmpInfo.bmiHeader.biCompression = BI_RGB;bmpInfo.bmiHeader.biBitCount = 32;//bmpInfo.bmiHeader.biSizeImage = bmpInfo.bmiHeader.biWidth * bmpInfo.bmiHeader.biHeight * bmpInfo.bmiHeader.biBitCount /8;bmpInfo.bmiHeader.biPlanes = 1;bmpInfo.bmiHeader.biXPelsPerMeter = 0;bmpInfo.bmiHeader.biYPelsPerMeter = 0;bmpInfo.bmiHeader.biClrImportant = 0;bmpInfo.bmiHeader.biClrUsed = 0;int nColors = 0;BITMAPFILEHEADER hdr;hdr.bfType = ((WORD) ('M'<<8) |'B'); //is always "RM"hdr.bfSize = bmpInfo.bmiHeader.biSize + bmpInfo.bmiHeader.biSizeImage + sizeof(hdr);hdr.bfReserved1 = 0;      hdr.bfReserved2 = 0;hdr.bfOffBits=(DWORD) (sizeof(hdr) + bmpInfo.bmiHeader.biSize + nColors * sizeof(RGBQUAD));fwrite(&hdr,sizeof(hdr), 1, pFile);bmpInfo.bmiHeader.biHeight = bmpInfo.bmiHeader.biHeight>0?bmpInfo.bmiHeader.biHeight:-bmpInfo.bmiHeader.biHeight;fwrite(&bmpInfo.bmiHeader, bmpInfo.bmiHeader.biSize, 1, pFile);int nBytesPerLine = bmpInfo.bmiHeader.biBitCount/8*bmpInfo.bmiHeader.biWidth;char *pOffset = (char*)picture.data[0] + (bmpInfo.bmiHeader.biHeight-1)*nBytesPerLine;for (int i=0; i<bmpInfo.bmiHeader.biHeight; i++) {fwrite(pOffset, nBytesPerLine, 1, pFile);pOffset -= nBytesPerLine;}fclose(pFile);avpicture_free(&picture);return true;
}

下载地址(仅是个demo,不含源码):https://download.csdn.net/download/u010868213/11847014

ffmpeg解码ps流部分代码以及PS播放器demo相关推荐

  1. ffmpeg 找不到bin_FFmpeg开发笔记(九):ffmpeg解码rtsp流并使用SDL同步播放

    若该文为原创文章,转载请注明原文出处 本文章博客地址:https://blog.csdn.net/qq21497936/article/details/109603499 各位读者,知识无穷而人力有穷 ...

  2. PS流包格式之PS/SYS/PSM/PES头

    PS流包格式 1,PS流的基本组成 PS流由很多个PS包组成. 每个PS包由如下组成: PS header + SYS header(I帧)+PSM header(I帧) +PES header+ P ...

  3. 最简单的基于FFmpeg的内存读写的例子:内存播放器

    ===================================================== 最简单的基于FFmpeg的内存读写的例子系列文章列表: 最简单的基于FFmpeg的内存读写的 ...

  4. python控制视频播放器的大小与位置_python_十几行代码实现简单播放器

    python20行代码实现简单播放器 播放器简介 播放器大家都并不陌生,我们听音乐,我们看视频都会用到.那么播放器实现的功能到底有哪些呢?一个播放器一般来讲都完成了如下步骤: 读取文件(包括音频文件和 ...

  5. python开发视频播放器_python_十几行代码实现简单播放器

    python20行代码实现简单播放器 播放器简介 播放器大家都并不陌生,我们听音乐,我们看视频都会用到.那么播放器实现的功能到底有哪些呢?一个播放器一般来讲都完成了如下步骤: 读取文件(包括音频文件和 ...

  6. python语言写视频播放器-python_十几行代码实现简单播放器

    python20行代码实现简单播放器 播放器简介 播放器大家都并不陌生,我们听音乐,我们看视频都会用到.那么播放器实现的功能到底有哪些呢?一个播放器一般来讲都完成了如下步骤: 读取文件(包括音频文件和 ...

  7. QT纯代码打造音乐播放器

    QT纯代码打造音乐播放器 在.pro文件中添加 QT = prmultimedia 然后就是在.h文件中添加相关库函数 我添加的库函数 有些是不需要的,可以自定义删除修改 我是为方便以后扩展功能就留下 ...

  8. 基于 FFmpeg 的播放器 demo

    这里的播放器演示程序用于播放一个本地文件,因而不需要关心播放网络上的媒体数据时的网络传输问题. 对于播放本地媒体文件的播放器来说,所要完成的工作主要包括:解封装 -> 音频解码/视频解码 -&g ...

  9. android基于ffmpeg本地视频、在线视频、直播播放器 支持rtmp、rtsp、http等协议

    最近做了一个支持onvif标准的摄像头管理程序,主要就是在局域网中通过程序控制摄像头获取摄像头视频流分发给广域网中的客户端设备:这里面用了onvif协议相关知识和ffmpeg视频流处理的相关知识. o ...

最新文章

  1. Java并发编程:Synchronized底层优化(偏向锁、轻量级锁)
  2. ubuntu QT Creater 安装
  3. unity 脚本中 调用另一个脚本_Unity 2019.4 脚本生命周期
  4. oracle 存储过程获取当前日期
  5. oracle 锁表 and 解锁
  6. C++的性能C#的产能?! - .Net Native 系列向导
  7. Visual Studio Code compile error - launch.json must be configured...
  8. CSDN APP又出错了,看不到博文
  9. LTE网络架构简化了
  10. Windows安全中心内存完整性无法打开问题的处理方法
  11. 红杉资本合伙人Maguire:Crypto将是未来30年最大趋势
  12. 微信语音功能模块的测试点
  13. 掌门少儿打造高质课程,助力少年儿童全方位发展
  14. 异或鉴相器 matlab 数字鉴相器,一款采用CPLD的光伏并网逆变器锁相及保护电路设计...
  15. 《SQL Server 2008从入门到精通》--20180724
  16. 强化学习用 Sarsa 算法与 Q-learning 算法实现FrozenLake-v0
  17. 华为HiLink智慧家庭生态发布 引领未来智能生活
  18. 简易扩音机设计1——麦克风篇
  19. Linux网络编程基础3:数据读写
  20. Hadoop权威指南笔记1——第1章:初始Hadoop

热门文章

  1. 05 -描述统计学- Project 分析问卷数据
  2. 简单的理解FFT变换
  3. 2019各省省选试题选做
  4. windows验证mysql是否安装成功
  5. 用户画像与大数据分析
  6. msm8660 add lcd driver
  7. QT 关于使用QThread实现多线程(moveToThread)
  8. C++中构造函数和析构函数常见面试题?
  9. oracle数据库sqlpuls报:12560(协议适配器错误)的解决办法
  10. Python一些可能用的到的函数系列81 基于Redis Stream的简单消息队列对象