
音视频经验杂谈
文章平均质量分 87
在各个平台做音视频开发的一些经验记录
Fighting Horse
专注移动端、桌面端跨平台程序架构;深入网络、音视频、3D渲染等技术应用。
展开
-
通过 ffmpeg 串流对接 OBS 等直播软件
我们要将设备通过私有通道输出到 H264 流,传给 OBS 等直播软件使用。为此,设计了上图所示的串流工具。原创 2022-12-15 15:14:19 · 2689 阅读 · 0 评论 -
实现 DirectShow 虚拟 Camera 驱动
今天我们要实现一个虚拟 Camera 驱动。有这个驱动,在 播放软件(如 VLC)、视频会议软件、主播视频制作软件(如 OBS)中,就可以播放、加入我们的各种特制内容了。原创 2022-09-13 19:47:21 · 4803 阅读 · 8 评论 -
在 Qt 中实现变色的图标(tintColor)
很多时候,设计要求当按钮的状态变化时(比如 hover、按下,禁用),按钮的背景、文字、图标能够改变颜色,以反馈按钮的当前状态。如下图:改变文字、背景的颜色很容易,但是改变图标颜色就比较麻烦了。早期的方案,是提供一整套不同颜色图片,分别设置给不同的状态。所有一旦要新加或者改变一个图标,都要设计提供一组图片文件,开发一个个的加到代码项目中,再添加一组设置图片的代码,是特别的麻烦。后来,一些平台提供了相关的解决方案,就是 tintColor。............原创 2022-08-31 19:16:11 · 2665 阅读 · 0 评论 -
Qt 中大尺寸图片的处理
我们的程序(用 Qt 实现),因为一个用户图标,在发到用户的产品中崩溃了。起因是这样的,我们允许用户注册上传自己的头像。然后中售卖的设备屏幕界面上,也会展示用户自己的头像。有一个用户上传了一个超大的头像图片,6144 x 6144 像素,jpg 的图片有 1.8M。然后他的设备的UI界面就经常卡死、崩溃。计算一下,假如图片每个像素 rgb 3 字节,那么 6144 * 6144 * 3 为 108M,对于 1个嵌入式平台,108 M已经很大了,申请这么大的内存很容易失败,那么程序崩溃就不足为奇了。.....原创 2022-08-28 10:27:30 · 4407 阅读 · 1 评论 -
实现支持 MJPEG 的播放器
(或:MJPG)是一种影像压缩格式,其中每一都分别使用编码。M-JPEG常用在和之类的图像采集设备上,系统也常用这种格式。播放器和包括,,在内许多原生支持M-JPEG。——对于网络摄像头时,使用 MJPEG 是一个比较低成本的方案,并且非常时候局域网配置。因为不需要很高的压缩效率,替换 H264、H265 会省下专利费和芯片成本。MJPEG 流没有统一的规范,微软使用很老的 AVI 格式封装,Mac 平台则用 Mp4 封装。对于流式传输,则是各个摄像头厂商自己定义协议了,所以需要实自己现播放。......原创 2022-08-25 18:46:14 · 2461 阅读 · 0 评论 -
一个 DirectShow 播放问题的排查记录
在Windows平台,基于ActiveMovie播放。ActiveMovie是WindowsMediaPlayer的一个组件,底层使用了DirectShow框架。原创 2022-07-24 13:55:11 · 902 阅读 · 2 评论 -
在 Mac 平台播放 H264 直播流
虽然做过音视频多年了,但是一直没有了解 Mac(以及 iOS)平台的音视频框架。最近要做一个 H264 纯视频流的播放,有机会研究了一下。方案调研 在 Mac 上播放视频,有好几个方案:方案一:使用AVPlayerAVPlayer 支持.mp4、.mov、.m4v、.3gp、.avi 这些文件格式,但是不支持raw h264,所以我们需要将raw h264 封装为上面的一种格式。然而,上面任意一种都是点播格式,没有一个能够描述持续不断的直播...原创 2021-12-12 09:41:09 · 3321 阅读 · 0 评论 -
基于 DirectShow 实现 SourceFilter 常见问题分析
很多年前记录了一篇实现 DirectShow SourceFilter 的文章(见 播放器插件实现系列 —— DirectShow 之 SourceFilter),那次只是简单实现验证了一下,并没有大规模上线使用。没想到多年之后,还有机会重拾之前的代码。这次功能开发上线还是遇到了一些问题,在这里记录一下。问题一:Windows SDK 不再包含 DirectShow 辅助库之前在 MFC 时代,微软提供了DirectShow sdk,可以方便我...原创 2021-12-11 15:04:47 · 857 阅读 · 0 评论 -
ExoPayer 研究、集成
参考: ExoPlayer HomeExoPlayer libraryHLS playback in ExoPlayerExoPlayer 2 - MediaSource compositionCustomizing ExoPlayer’s UI components 使用Android.mk文件导入Exoplayer包ExoPlayer浅析Google Exoplayer 之全...原创 2019-04-21 10:16:33 · 2096 阅读 · 0 评论 -
播放框架 - TextureView 播放
Hardware acceleration用MediaPlayer+TextureView封装一个完美实现全屏、小窗口的视频播放器存在问题:1、导致UI的文字显示成方块备注1:SurfaceTexture 创建的 stack06-04 10:28:10.678 1433 1433 D WallpaperTextureView: onSurfaceTextureAvailable...原创 2019-04-21 10:38:11 · 337 阅读 · 0 评论 -
播放框架 - 基于 OpenGL 的媒体播放
TextureView 播放 GL 渲染 OpenGL 渲染 TextureDisplay GPUImage 集成 OpenGL - 图像过渡滤镜 OpenGL - 渲染多个 Surface OpenGL - 图像美颜滤镜原创 2019-04-21 10:35:03 · 159 阅读 · 0 评论 -
播放框架 - GL渲染
1、WallpaperGLThread2、GLMediaDisplay3、GLRenderer4、GLImageRenderer5、GLVideoRenderer问题:从GL渲染切回正常渲染,会播放失败(即使刷新Surface,也被GL绑定,依赖解决)播放框架 - GLVideoRendererOpenGL 从零开始写一个Android平台下的全景视频播放器TextureVi...原创 2019-04-21 10:49:29 · 1200 阅读 · 0 评论 -
WebRTC源码环境搭建
获取depot_toolsWebRTC代码都是用depot_tools工具来管理,所以第一步就是要获取这个工具。在/chromium目录里面运行:git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git这样depot_tools工具就下载到了/webrtc/depot_tools目录里面,然后...原创 2019-04-27 09:48:15 · 1588 阅读 · 0 评论 -
WebRTC构建(Windows环境)
WebRTC源码环境搭建上文https://blog.youkuaiyun.com/luansxx/article/details/89597525Windows工具准备安装 VS2017安装 python 2.7设置构建环境增加下列环境变量:PATH = %PATH%:Y:\work\webrtc\depot_toolsDEPOT_TOOLS_WIN_TOOLC...原创 2019-04-27 10:55:56 · 4335 阅读 · 2 评论 -
WebRTC 升级接口方法调整(Windows)
WebRTC 调整1、VideoFrameBuffer 改成 I420BufferInterface,使用 ToI420 转换2、MediaFile 没有了,相关代码被注释,都是测试功能3、AudioDeviceModuleImpl::Create 接口调整4、LOG_F 没有了, RTC_LOG_F 代替5、CreatePeerConnection 接口变化(已经调整)6...原创 2019-04-27 11:57:49 · 789 阅读 · 0 评论 -
Webrtc研究
WebRTC源码环境搭建WebRTC构建(Windows环境)WebRTC 升级接口方法调整(Windows)原创 2019-04-27 11:58:09 · 277 阅读 · 0 评论 -
构建 FFMpeg (Windows MSYS2/MinGW-w64)
(一)环境准备安装 MSYS2https://github.com/msys2/msys2/wiki/MSYS2-installation安装MinGW-w64打开MSYS2 MinGW 64bit(只是一个独立环境),用 pacman 安装MinGW-w64pacman -S mingw-w64-x86_64-gccpacman -S mingw-w64-x86_...原创 2019-04-28 11:16:08 · 1083 阅读 · 0 评论 -
Android -> Windows 多样化投屏方案
需求投屏有两种方式:镜像屏幕和扩展屏幕,分别在两个屏幕上显示相同、不同的内容。多样化场景下,需要结合两种方式,比如:在两种方式下切换,某些页面(Activity)镜像投屏,某些需要在扩展屏另外展现不同的内容 两种方式叠加,在镜像上面显示部分不同的内容 部分区域镜像,类型PPT演讲者模式方案(一)多端互动局域网发现采用mDns相对更独立灵活一些,Android原生有AP...原创 2019-04-28 11:30:28 · 2194 阅读 · 0 评论 -
Android 投屏实现纪要
在前文里介绍了Android -> Windows 多样化投屏方案这里记录具体的实现(一)屏幕截取MediaProjection/VirtualDisplay因为权限问题,不能直接创建镜像(VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR)类型的VirtualDisplay,需要通过MediaProjection 提示用户授权。 Medi...原创 2019-04-28 13:12:36 · 5919 阅读 · 0 评论 -
优化 Android 投屏实时性
优化编码延迟编码器延迟主要优化方式有:去除B帧,目前Android编码器基本都是 H264 Baseline 配置,没有启动B帧编码。另外Android 最新 API 多了 MediaFormat.KEY_LATENCY 编码参数,在平台上有没有用,目前资料比较少,不太清楚。优化网络延迟通过抓包发现,网络上数据包存在周期性脉冲输出流量,怀疑网络传输中存在小报文拼接批量传输的行为...原创 2019-04-28 15:21:01 · 2400 阅读 · 0 评论 -
动态视频流切换的处理策略
问题背景动态视频流切换是指在视频播放过程中,将输入动态地从一个视频流切换到另一个视频流。具体场景包括:切换播放画质 插播广告(有多个广告打包插播) 电视剧连续播放 多个点播节目拼接为虚拟直播频道 用户切换播放节目动态切换播放视频流,需要做到无缓冲、不闪黑屏,声音连续。方案设计因为存在插播,直观上需要通过树形结构来描述视频流的关系,但是这样做的复杂度很高,需要寻找简单的模型...原创 2019-01-29 10:47:21 · 2224 阅读 · 0 评论 -
SurfaceHolder/Surface 与 MediaPlayer 异步问题探讨
SurfaceHolder 在主线程通知 Surface 的创建、销毁、变化,一般此时将 Surface 设置给 MediaPlayer,这没有问题。本文讨论的场景是在另一个线程异步的给MediaPlayer设置Surface会出现什么问题,如果想用独立的状态机线程与 MediaPlayer 协作,这将是一个确实存在的问题。异步设置 Surface 存在 Surface失效问题。考虑S...原创 2019-01-24 12:24:37 · 622 阅读 · 0 评论 -
mpeg 音频格式科普
mpeg的音频格式蛮多的,又是MP3,又是aac,有些地方用mpga,mp4a表示mpeg的音频,这之间到底有什么区别和联系呢?最近花了两天时间,通过网上的零散资料整理了一下。mpeg -1 part 3(也就是mpeg标准第1版的第3部分)定义了mpeg audio version 1,而其又包含3个layer:mpeg-1 layer 1、mpeg-1 layer 2、mpeg-1 lay原创 2012-09-24 19:39:27 · 4633 阅读 · 1 评论 -
三星播放器的小BUG
播放器通过HTTP请求数据,HTTP头部应该以两个“\r\n”结束,但是三星 GT-I9100G 手机的播放器用三个“\r\n”结束,当User-Agent是最后一个头域的时候,难道User-Agent的那个字符串里面多了一个“\r\n”提到三星播放器,不得不说,他的怪脾气还真多。就像现在这个HTTP请求MP4文件,他要一点点Range请求,前面一点后面一点,又不像并行多连接,不知道出于什么考原创 2012-08-23 16:43:25 · 1179 阅读 · 0 评论 -
播放器适配经验总结——Android
Android的流媒体协议支持不太好,标准只支持RTSP和MP4 over HTTP。因为MP4头部大,启动会比较慢,另外MP4也不适合做直播。当然基于Android的开放性,完全可以自己做一个播放器,难点是要做解码和显示的适配,Android机型太多,这个适配工作量比较大。Android升级到4.0版本应该支持HLS,目前也有一些设备厂商在2.x版本上支持的HLS。但是要做统一的产品,还是只能用原创 2012-07-06 12:38:20 · 4909 阅读 · 0 评论 -
播放器适配经验总结——IOS
IOS平台统一使用HLS协议,包括M3U8文件和分段TS文件1、抖屏现象:播放中画面动作抖动,好像画面的顺序错乱范围:Mp4文件转成TS,没有问题,ASF转成TS文件,有该现象原因:ASF没有cts_delta字段,TS(PES)中的PTS直接使用DTS,H.264中帧的顺序是DTS顺序,与显示顺序是不同的,B帧会出现在P帧前面,但是在后面显示方案:自己根据帧率和帧的顺序,计算原创 2012-07-06 11:26:41 · 8458 阅读 · 0 评论 -
webrtc 针对 windows 平台的编译和运行
1 环境准备官方说明:http://www.webrtc.org/reference/getting-started/prerequisite-sw1.1 安装 SVN安装 TortoiseSVNhttp://tortoisesvn.net/downloads.html1.2 安装 git1.3 安装 Depot Tools官方说明:https://sites.原创 2013-09-11 16:17:33 · 4803 阅读 · 0 评论 -
webrtc 针对 android 平台的编译和运行
1 环境准备官方说明:http://www.webrtc.org/reference/getting-started/prerequisite-sw1.1 安装 SVNwindows 安装 TortoiseSVNhttp://tortoisesvn.net/downloads.htmllinux 直接用 apt-get 安装sudo apt-get in原创 2013-09-11 15:48:57 · 12513 阅读 · 0 评论 -
YUV 格式最详细的手册
http://linuxtv.org/downloads/v4l-dvb-apis/yuv-formats.html原创 2013-11-17 09:52:29 · 1559 阅读 · 0 评论 -
播放器插件实现系列 —— 序言
我们之前做了一套库(SDK),可以把自己的流媒体内容提供给第三方使用。SDK使用API接口,接口相对简单,主要有下列函数: Open; Pause; Close; GetStreamCount; GetStreamInfo; GetDuration; Seek; ReadSample;现在我们需要将这套库集成到各种播放器框架中,如比较有名的:v原创 2012-06-21 12:26:34 · 677 阅读 · 0 评论 -
播放器插件实现系列 —— DirectShow 之 SourceFilter
directshow 的文档比较详细,这里我们其实是要实现一个DirectShow 的 SourceFilter,在DirectShow提供的sdk包中,有实例代码(目录:Extras\DirectShow\Samples\C++\DirectShow\),我们的工程是拷贝Filters\PushSource然后做修改。主要修改如下:1、setup.cpp注册我们的filter原来的P原创 2012-06-21 12:31:46 · 4482 阅读 · 1 评论 -
播放器插件实现系列 —— vlc
vlc 是通过模块来扩展它的功能,插件一般就是实现一个模块。vlc的模块有很多类型:AccessDemuxAccess_DemuxDecoderInterface Video filterAudio filterAudio outputAccess提供输入功能,比如HTTP输入、文件输入Demux提供解封装功能,比如Asf、Mp4、Ts的解封装Access_Demu原创 2012-06-21 12:32:23 · 12356 阅读 · 5 评论 -
播放器插件实现系列 —— mplayer
mplayer严格来说是不支持插件的,这与他的定位有关。mplayer有很多定制版,比如GMplayer,SMPlayer,MPlayerX,更多定制版是用在嵌入式平台,没有名字。mplayer是比较轻量级的播放器,结构小巧,但是编解码支持并不比其他播放器少。在mplayer上增加插件,需要直接修改源码,发布自己的定制版。与vlc不一样,mplayer中协议输入和解封装是必须分开的两个原创 2012-06-21 12:33:24 · 4169 阅读 · 0 评论 -
mplayer 在 mingw 上的交叉编译
mplayer是比较成熟的开源播放器框架了,但是开发文档却是稀少的很,这一点与微软的directshow没办法比。当然mplayer是同时支持linux、windows、macos的;相反directshow根本就不能跨平台。 不过我们这里只说移植,至于开发可以看看我的另一篇文章播放器插件实现系列 —— mplayer 各位可以先看看mplayer的跨平台移植说明:http:/原创 2012-06-21 13:03:00 · 2526 阅读 · 0 评论 -
MPlayer Win32版本的H.264解码问题
下载了MPlayer-1.1源码并用mingw编译成功了,运行播放了几个视频文件,都OK。然而在测试了更多的视频文件时,出问题了,一直会输出下面的错误消息:A:454786.5 V:454786.5 A-V: 0.031 ct: 0.034 0/ 0 45% 15% 1.6% 23 0[h264 @ 0xdc3f00]Reference 6 >= 3[h264 @ 0xdc原创 2012-07-04 16:17:03 · 4884 阅读 · 0 评论 -
airplay 逆向工程
UnofficialAirPlay Protocol Specification - nto.github.comopen-airplay - A collection of libraries for connecting over Apple's...Airtunes2 - Specification of RAOPprotocol with timing.原创 2013-11-17 16:48:52 · 2250 阅读 · 0 评论 -
Windows Store 环境 ffmpeg 构建集成
WinRT 环境 ffmpeg 构建集成原创 2013-11-20 11:20:55 · 1213 阅读 · 0 评论 -
AirPlay、AirTunes 移植开发
1、技术介绍2、开源项目2.1、expat开源地址:http://sourceforge.net/projects/expat/下载目录:http://sourceforge.net/projects/expat/files/expat/最新版本(2.1.0):http://sourceforge.net/projects/expat/files/expat/2.1.0/exp原创 2013-11-20 12:05:17 · 6693 阅读 · 0 评论 -
Android Surface 使用总结
1、Surface的本质1.1、BufferQueueAndroid通过BufferQueue管理图像图层数据的跨进程传输。BufferQueue的两端分别是图像数据的生产者和消费者。1.2、GraphicBufferGraphicBuffer(简称Buffer)是BufferQueue传递的数据,一个Buffer包含一帧图像,Buffer由gralloc分配和回收。根据需求Buf...原创 2019-01-24 11:39:13 · 7582 阅读 · 2 评论