MJPEG 简介

Motion JPEGM-JPEGMJPEG,Motion Joint Photographic Experts Group,FourCC:MJPG)是一种影像压缩格式,其中每一帧图像都分别使用JPEG编码。M-JPEG常用在数码相机和摄像头之类的图像采集设备上,非线性剪辑系统也常用这种格式。QuickTime播放器和包括Mozilla Firefox,Google Chrome,Safari在内许多网页浏览器原生支持M-JPEG。

—— https://zh.m.wikipedia.org/zh-hans/Motion_JPEG

对于网络摄像头时,使用 MJPEG 是一个比较低成本的方案,并且非常时候局域网配置。因为不需要很高的压缩效率,替换 H264、H265 会省下专利费和芯片成本。

MJPEG 流没有统一的规范,微软使用很老的 AVI 格式封装,Mac 平台则用 Mp4 封装。对于流式传输,则是各个摄像头厂商自己定义协议了,所以需要实自己现播放。下面介绍各个播放框架中,怎么实现 MJPEG 的播放。

DirectShow 框架

实现一个 SourceFilter,输出 MJPEG 格式的压缩视频。

关键的配置代码如下:

static HRESULT FillMJPG(CMediaType* pMediaType, Bambu_StreamInfo const* m_info)
{VIDEOINFOHEADER* pvi =(VIDEOINFOHEADER*)pMediaType->AllocFormatBuffer(sizeof(VIDEOINFOHEADER));if (pvi == 0)return(E_OUTOFMEMORY);ZeroMemory(pvi, pMediaType->cbFormat);int sizeImage = m_info->format.video.width * m_info->format.video.height * 3;pMediaType->SetSubtype(&MEDIASUBTYPE_MJPG);pMediaType->SetFormatType(&FORMAT_VideoInfo);pMediaType->SetTemporalCompression(FALSE);pMediaType->SetSampleSize(sizeImage);SetRect(&(pvi->rcSource), 0, 0, m_info->format.video.width, m_info->format.video.height);CopyRect(&(pvi->rcTarget), &(pvi->rcSource));pvi->AvgTimePerFrame = 0;//UNITS / m_info->video_format.frame_rate;BITMAPINFOHEADER* bmi = &pvi->bmiHeader;bmi->biSize = sizeof(BITMAPINFOHEADER);bmi->biPlanes = 1;bmi->biClrImportant = 0;bmi->biClrUsed = 0;bmi->biWidth = m_info->format.video.width;bmi->biHeight = m_info->format.video.height;bmi->biSizeImage = sizeImage;bmi->biBitCount = 24;bmi->biCompression = 'GPJM'; // MJPGreturn S_OK;
}

其中 biBitCount 一定要设置,因为 jpg 没有 alpha 通道,所以一般是 24 bit 深度。我一开始没有设置,与 “MJPEG Decompressor” 就无法连接。

VideoToolBox 解码

在 Mac 平台,使用 VideoToolBox 解码 MJPG 格式的视频。

关键的配置代码如下:

status = CMVideoFormatDescriptionCreate(kCFAllocatorDefault, kCMVideoCodecType_JPEG, stream_info.format.video.width, stream_info.format.video.height, NULL, &formatDescription);

另外发现一个诡异的问题:图像显示顺序是乱的,会显示一张新图像,再显示一张之前的图像,如此反复。

后来发现,在解码回调函数里面拿到 IOSurfaceRef 图像,必须马上使用,post 到 ui 线程处理时,要等待 ui 线程处理完成。但是同样的代码,对于 H264 解码器,是正常的。

改成同步等待(用 dispatch_sync 代替 dispatch_async),就 OK 了。

- (void) didDecompress: (OSStatus) status with:(CVImageBufferRef) imageBuffer {IOSurfaceRef surface = CVPixelBufferGetIOSurface(imageBuffer);dispatch_sync(dispatch_get_main_queue(), ^{if (self->playing && surface != nil)view.layer.contents = (__bridge id) surface;});
}

实现支持 MJPEG 的播放器相关推荐

  1. Android 中封装优雅的 MediaPlayer 音频播放器,支持多个播放器

    Android 中封装优雅的 MediaPlayer 音频播放器,支持多个播放器实例的示例: public class AudioPlayer implements MediaPlayer.OnPre ...

  2. java支持wmv的播放器_支持wmv、mpg、mov、avi格式的网页视频播放代码

    这2天一直在整金网奖的相关项目,比较头大的就是网页视频播放了,需要考虑各种不同格式的视频,然后找相应的视频播放器. 这次使用了2种方法对这些视频进行处理: 1.使用ckplayer网页视频播放器 ck ...

  3. java支持wmv的播放器_支持各种格式的视频播放器代码

    Java代码   /** *视频播放 *参数说明 u - 媒体URL w - 媒体宽度width h - 媒体高度height */ //播放Mediaplayer格式的视频,包括.avi .mpg  ...

  4. xbs2009,2010不支持远古2009播放器 解决方案

    打开网站目录对应模板的movie.asp.把最下面的哪个2009 改成2008 转载于:https://www.cnblogs.com/fox2013/p/3409225.html

  5. 使用AVPlayer自定义支持全屏的播放器(一)

    前言 最近在项目中,遇到了视频播放的需求,直接使用系统封装的播放器太过于简单,不能很好的满足项目要求,于是花时间研究了一下,使用AVPlayer来自定义播放器.     本视频播放器主要自定义了带缓冲 ...

  6. 微信中H5同层Video播放器接入教程

    微信中H5同层Video播放器接入教程 x5-video-player-type 启用H5同层播放器 通过video属性"x5-video-player-type"声明启用同层H5 ...

  7. C# 视频监控系列(11):H264播放器——封装API[HikPlayM4.dll]

    前言 当你认真的写完客户端和服务器端的时候可能不需要再继续往下看关于播放器的代码和说明,因为你已经掌握了如何转换VC++代码的技巧了,加上GOOGLE再来完成这个播放器应该算小菜了.但是作为我的系列, ...

  8. 10款Flash和Javascript网页音乐播放器

    关联:9 Fresh jQuery Media Players 10款音乐播放器, 有基于javascript的网页 音乐播放器,也有基于Flash的音乐播放器.赶快挑一款,分享你喜爱的音乐吧! 1. ...

  9. 修改了一个YUV/RGB播放器

    最近在学习过程中查看YUV/RGB像素数据的时候,发现找不到一个合适的播放器.主流的YUV播放器大多只支持YUV格式播放,却不支持RGB格式数据播放.而我正好需要查看RGB像素数据.在Sourcefo ...

最新文章

  1. 如何修改word中的单位信息、用户信息及文档属性
  2. springmvc学习(小知识点整理)
  3. JVM - G1初探
  4. java中s方法_Java中Arrys数组常用的方法
  5. cuda Synchronization
  6. 集中化Linux日志管理系统
  7. 【电脑配置】开发人员必备,黑苹果双系统安装教程
  8. Anaconda修改默认浏览器
  9. ios 判断iPhone、iPad硬件型号
  10. 利用python自动在火狐浏览器上输入账号密码
  11. Sublime Text 3 使用心得
  12. 1分钟学会便捷绘制跨职能流程图
  13. 《C#零基础入门之百识百例》(九)位和赋值运算符 -- 2的n次幂
  14. 优秀的加密方案-软件加密技巧
  15. 西安80转2000坐标参数_ERDAS中自定义坐标系的方法(转自百度,仅供参考)
  16. 安装MS SQL Server2000“以前的某个程序安装已在安装计算机上创建挂起的文件操作”的解决办法
  17. 白宫举办开源安全峰会,众多科技巨头参加
  18. 牛客刷题日记(2021-12-8)
  19. 小程序上传视频的php接口处理,微信小程序[第十二篇] -- 上传视频
  20. 2011年30家最能赚钱移动互联公司排行榜

热门文章

  1. 【渝粤题库】广东开放大学 建筑力学与结构 形成性考核
  2. 命令集matlab,Matlab常用命令集2
  3. 手机网上订货下单软件|移讯云订货通企业订货管理系统介绍
  4. 门店如何利用会员系统软件做精细化运营管理
  5. Polar SC的C语言实现之译码篇
  6. 快应用联盟展示入口合集(11月更新)
  7. Ansible的脚本(playbook剧本)
  8. 一名测试工程师的苦逼感想
  9. 电脑端同时登陆两个微信(非网页版)
  10. nmn成分是什么,吃nmn对身体有哪些好处,掌握知识点