
多媒体播放(音视频解析、编解码、渲染)
文章平均质量分 65
该专栏中的内容主要涉及多媒体播放中的知识,以及遇到的问题
小白啥时候能进阶成功
理解乃记忆之母,重复乃记忆之父。一遍不懂看两遍,两遍不懂看三遍,书读百遍其义自见。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
微信小程序读取二进制文件
开发工具右上角的详情–>基本信息–>文件系统–>当前小程序文件系统根目录。拿到ArrayBuffer二进制数据文件。将二进制数据文件放在文件系统目录下。原创 2023-02-06 16:14:19 · 1933 阅读 · 0 评论 -
微信小程序
小程序开发原创 2023-02-03 16:29:29 · 898 阅读 · 0 评论 -
MSE和Video标签的关系
拥有解封装和解码功能的浏览器自带播放器随着视频点播、直播等视频业务的发展,视频通过流媒体传输协议(目前常用的有两种,MPEG-DASH和Apple的HLS)从服务器端分发给客户端,媒体内容进一步包含在一层传输协议中,这样就无法识别了。以HLS为例,将源文件内容分散地封装到了一个个TS文件中。仅靠标签无法识别这样的TS文件,那么就引入了MSE拓展来帮助浏览器识别并处理TS文件,将其变回原来可识别的媒体容器格式,这样就可以识别并播放原来的文件了。原创 2022-11-29 15:50:58 · 1656 阅读 · 0 评论 -
FLV封装格式的解析(profile和level)
FLV(Flash Video)是Adobe公司设计开发的一种流行的流媒体格式,由于其视频文件体积轻巧、封装简单等特点,使其很适合在互联网上进行应用。此外,FLV可以使用Flash Player进行播放,而Flash Player插件已经安装在全世界绝大部分浏览器上,这使得通过网页播放FLV视频十分容易。目前主流的视频网站如优酷网,土豆网,乐视网等网站无一例外地使用了FLV格式。FLV封装格式的文件后缀通常为“.flv”。 总体上看,FLV包括文件头(File Header)和文件体(File Bod.原创 2022-02-15 16:47:19 · 419 阅读 · 0 评论 -
着色器语言
一、简单矩形1、顶点着色器下面是一个三角形的顶点着色器#version 330 core// 输入数据 aPos输入是一个(x,y)的向量// aColor是一个4维向量attribute vec2 aPos;attribute vec4 aColor;// 输出至片段着色器的数据out vec4 Color;void main(){ // color在顶点着色器里不用,直接输出 Color=aColor; // gl_Position是内置函数,这里是4个参数,x,原创 2022-02-11 16:14:47 · 2219 阅读 · 0 评论 -
解码中的AnnexB和avcC两种分割数据方式
目前 H.264 流行的包装方式有两种,一种叫做 AnnexB,一种叫做 avcC。对于这两种格式,各家的支持程度也不太一样,例如,Android 硬解码 MediaCodec 只接受 AnnexB 格式的数据,而 Apple 的 VideoToolBox,只支持 avcC 的格式。所以这就需要我们从业者对两种格式都有一个了解。本章,我们先来介绍 AnnexB1、AnnexB1.1 介绍假如我们把多个 NALU 写到一个文件里面去,多个 NALU 首位相连穿成一串,因为 NALU 本身长度不一,原创 2022-01-20 17:18:50 · 8384 阅读 · 0 评论 -
按需裁剪FFmpeg,并使用Emscripten进行编译运行
一、FFmpeg有三种版本Download FFmpeg1、static 版本静态库版本 里面有3个exe: ffmpeg.exe, ffplay.exe, ffprobe.exe,每个exe体积很大,因为相关的dll已经被编译到exe 里面去了。作为工具而言此版本就可以满足我们的需求。2、shared 版本 动态库版本,里面有3个exe:ffmpeg.exe,ffplay.exe , ffprobe.exe ,还有一些dll, 比如说avcodec-54....原创 2022-01-17 14:22:59 · 558 阅读 · 0 评论 -
Clang编译链接FFmpeg常见问题
最近闲来无事,就开始研究下和ffmpeg相关都知识,看了网上关于ndk编译ffmpeg的教程,基本上都是使用gcc来编译,而ndk从r18b开始就正式移除gcc来,因此很有必要研究下clang编译ffmpeg,在此过程中遇到了不少奇怪的问题。系统:macosffmpeg版本:4.1.3ndk版本:r19c编译器:clang1、命令找不到错误信息: ./build_android.sh: line 18: --enable-shared: command not foun原创 2021-12-16 13:44:51 · 1424 阅读 · 0 评论 -
硬解码基本介绍
一、概念介绍硬解码:同一套代码可以运行在不同(厂商)的显卡上。通常指DXVA,D3D11VA。是微软所设立的一套API,可以把解码的部分工作从CPU转移到GPU上,这样就可以利用GPU硬件单元的并行处理来加速处理,降低了CPU的使用率。(利用GPU(Graphic Processing Unit)加速解码)...原创 2021-11-02 10:29:57 · 2558 阅读 · 0 评论 -
OpenAL问题咨询和官方文档
https://github.com/kcat/openal-soft/issues原创 2021-01-04 19:53:14 · 235 阅读 · 0 评论 -
web端音频对讲介绍
一、对讲系统两个过程介绍对讲系统1:音频播放数据流走向:本端:web客户端->浏览器访问电脑的话筒,采集音频PCM (使用OpenAL中的API进行采集) 本端:Web中的jsdecoder对PCM进行编码 对端:IPC设备解码播放我们负责解码播放(decoder)ipc设备采集声音->web端->jsdecoder解码->扬声器播放对讲系2:PCM编码对端:IPC设备采集数据(硬件采集) 对端:设备对数据进行编码 本端:Web端JSDecoder解码,原创 2020-11-26 10:30:59 · 1164 阅读 · 0 评论 -
YUV常见的类型
YUVPlayer里的所有YUV类型:IUYV、IYU2、IYUV(I420)、NV12、NV16、UYVY、YUYV、YV12、YV16、YVYU、RGB565、RGB24、RGB32。I420和YV12的区别:UV分量的位置不同软解一般都是YV12。硬解根据平台不同出来的YUV类型也不同:例如ios和Windows是NV12,Android是纹理 YUV 4:4:4采样,每一个Y对应一组UV分量。 YUV 4:2:2采样,每两个Y共用一组UV分量。 YUV 4:2:0采样,每四个Y共原创 2020-10-28 13:41:44 · 1307 阅读 · 0 评论 -
2020-10-27
1、引言现实生活中,我们听到的声音都是时间连续的,我们称为这种信号叫模拟信号。模拟信号需要进行数字化以后才能在计算机中使用。目前我们在计算机上进行音频播放都需要依赖于音频文件。音频文件的生成过程是将声音信息采样、量化和编码产生的数字信号的过程,人耳所能听到的声音,最低的频率是从20Hz起一直到最高频率20KHZ,因此音频文件格式的最大带宽是20KHZ。根据奈奎斯特的理论,只有采样频率高于声音信号最高频率的两倍时,才能把数字信号表示的声音还原成为原来的声音,所以音频文件的采样率一般在40~50KHZ,转载 2020-10-27 20:31:26 · 388 阅读 · 0 评论 -
音频基础知识
编码后的音频,解析->解码->渲染数据采集(采样率:G711A(8-bit A-Law Compressed)默认8k)PCM数据—>编码—>解码(.wav文件)采样率每秒钟取得声音样本的次数。(8K,16K)(目前G711,G726只支持8K,G722只支持16K)采样频率越高,声音的质量也就越好,声音的还原也就越真实,但同时它占的资源比较多。由于人耳的分辨率很有限,太高的频率并不能分辨出来。每秒从连续信号中提取并组成离散信号的采样个数,它用赫兹(Hz)来表示,采样原创 2020-10-19 21:00:43 · 2027 阅读 · 0 评论 -
OpenAL播放音频
参考网站https://www.cnblogs.com/leaving/p/openal_begin.htmlOpenAL设计给多通道三维位置音效的特效表现。其 API 风格模仿自OpenGL。1、播放音频Demo(OpenAL使用流程)ALuint Source;// 用于播放声音ALuint Buffer;// 声音数据int main(int argc, char *argv[]){ InitOpenAL(); // 初始化openal Lo原创 2020-10-15 20:47:38 · 1190 阅读 · 0 评论 -
Directsound(微软),Waveout、openAL和前端的AudioContext
openAL是跨平台的(windows,linux都可用)目前windows平台大多使用dSound;linux平台大多使用openAL一、Waveoutwaveout是在32位的Windows上的一种老旧且过时,用来播放数字音讯的应用程序接口。旧的Windows操作系统(如Win9x WinNT4)在 Wav eout 的完成度很高(因为 waveout 是针对这些操作系统设计的)。Waveout 的功能局限:无法支持「混和多重音讯流」的功能。 没有使用任何的硬件加速功能,所有的混音原创 2020-10-14 18:36:53 · 3899 阅读 · 0 评论 -
离屏渲染机制描述
1、GPU渲染机制CPU 计算好显示内容提交到 GPU,GPU 渲染完成后将渲染结果放入帧缓冲区,随后视频控制器会按照 VSync 信号逐行读取帧缓冲区的数据,经过可能的数模转换传递给显示器显示。2、GPU屏幕渲染方式GPU屏幕渲染方式有两种: On-Screen Rendering (当前屏幕渲染) 指的是GPU的渲染操作是在当前用于显示的屏幕缓冲区进行。 Off-Screen Rendering(离屏渲染) 指的是GPU在当前屏幕缓冲区以外开辟一个缓冲区进行渲染操作。原创 2020-11-13 14:44:36 · 464 阅读 · 0 评论 -
鱼眼图像
鱼眼图像由视场角接近180度甚至大于180度的镜头拍摄得到,图像周围畸变严重。鱼眼的安装方式:顶装、底装、壁装鱼眼的矫正方式:360度模式、180度模式、纬度拉伸模式、PTZ模式1、原始鱼眼图2、180度展开3、360度全景展开4、360度+1PTZ5、纬度展开鱼眼镜头可以视为一个半球,经纬法按照球面贴图的类似思想将图像以球面形式展开。1、视场角假设为180度,如果按照球的北极点(南极点)为图像的中心,展开后会是这个样子:图像中心为北极点:原创 2020-09-03 13:49:39 · 2564 阅读 · 2 评论 -
离屏渲染的代价
1、创建新缓冲区想要离屏渲染,就必须创建一个新的缓冲区;2、上下文切换离屏渲染的整个过程,需要多次切换上下文环境:先是从当前屏幕(On-Screen)切换到离屏(Off-Screen);等到离屏渲染结束以后,将离屏缓冲区的渲染结果显示到屏幕上。而上下文环境的切换是要付出很大代价的。离屏渲染:要涉及到缓冲区创建和上下文切换等耗时操作。GPU 或 CPU在当前屏幕缓冲区以外新开辟一个缓冲区进行渲染操作。过程中需要切换 contexts (上下文环境),先从当前屏幕切换到离屏的context.原创 2020-08-28 16:14:52 · 191 阅读 · 0 评论 -
web端 子线程调用opengl es
1、main中使用emscripten_pthread_attr_settransferredcanvases将主线程创建的canvas转移到子线程。int main() { if (!emscripten_supports_offscreencanvas()) { printf("Current browser does not support OffscreenCanvas. Skipping the rest of the tests.\n");#ifdef原创 2020-08-21 16:32:20 · 1306 阅读 · 1 评论 -
getContext()方法
https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/getContextHTMLCanvasElement.getContext()返回一个canvas渲染的上下文,如果不支持返回null.var ctx = canvas.getContext(contextType);var ctx = canvas.getContext(contextType,contextAttributes);contextType参原创 2020-08-20 15:31:43 · 22066 阅读 · 0 评论 -
web上的OffscreenCanvas-离屏canvas使用说明(离屏渲染)
https://blog.youkuaiyun.com/netcy/article/details/103781610OffscreenCanvas 是一个实验中的新特性,主要用于提升 Canvas 2D/3D 绘图的渲染性能和使用体验。OffscreenCanvas和canvas都是渲染图形的对象。 不同的是canvas只能在window环境下使用,而OffscreenCanvas既可以在window环境下使用,也可以在web worker中使用,这让不影响浏览器主线程的离屏渲染成为可能。与之关联的还有I原创 2020-08-20 14:51:16 · 4814 阅读 · 0 评论 -
webgl中如何做YUV数据的裁剪
针对有裁剪信息的码流(1088,768),在进行渲染之前需要进行YUV数据的裁剪,因为裁剪区域的码流为冗余数据,如果不进行裁剪,渲染出来将有蓝边或紫边状态。在将YUV数据上传到纹理前进行YUV的裁剪。即https://blog.youkuaiyun.com/qq_34754747/article/details/107281312 webgl渲染过程中的步骤:上传YUV数据到纹理updateFrameDataupdateFrameData = function(oWidth,oHeight,dat..原创 2020-07-11 11:50:43 · 834 阅读 · 0 评论 -
OpenGL/OpenGL ES入门(五): 图像渲染实现以及渲染问题(纹理坐标和顶点坐标对应问题)
开始渲染1.填充(清理)屏幕glClearColor(0.1f, 0.9f, 0.5f, 1);//指定填充屏幕的RGBA值glClear(GL_COLOR_BUFFER_BIT);//指定要清除哪些缓冲区,GL_COLOR_BUFFER_BIT表示颜色缓冲区、GL_DEPTH_BUFFER_BIT表示深度缓冲区,GL_STENCIL_BUFFER_BIT表示模板缓冲区2、从着色器代码中获取属性信息 GLuint m_simpleProgram = g_ShaderProgram;原创 2020-08-14 12:01:11 · 623 阅读 · 0 评论 -
OpenGL/OpenGL ES入门(二):EGL的介绍和使用(context上下文的创建和初始化)
一、简介EGL 是渲染 API(如 OpenGL ES)和原生窗口系统之间的接口。通常来说,OpenGL 是一个操作 GPU 的 API,它通过驱动向 GPU 发送相关指令,控制图形渲染管线状态机的运行状态,但是当涉及到与本地窗口系统进行交互时,就需要这么一个中间层,且它最好是与平台无关的。因此 EGL 被设计出来,作为 OpenGL 和原生窗口系统之间的桥梁。二、功能EGL API 是独立于 OpenGL ES 各版本标准的独立的一套 API。2.1 主要作用:为 OpenGL原创 2020-08-13 14:16:12 · 5116 阅读 · 0 评论 -
OpenGL/OpenGL ES入门(四):纹理初探initTexture
一、什么是纹理在之前的几篇文章中,已经对点、线和三角形进行了渲染,也看到了如何通过计算颜色值对它们进行着色,以及在它们之间进行值操作来模拟光照效果。为了能够达到更加真实的效果,这一篇引入纹理贴图。纹理只是一种能够应用到场景中的三角形上的图像数据,它将经过过滤的纹理单元(texel,相当于基于纹理的像素)填充到实心区域。初识纹理的小伙伴们可以理解为,纹理就是图片。当然纹理远远不止是图像数据这么简单,它是大多数现代3D渲染算法的一个关键因素。这里只做简单了解。二、像素2.1 像素包装图像数据原创 2020-08-12 19:07:00 · 484 阅读 · 0 评论 -
OpenGL/OpenGL ES入门(三):着色器创建和着色器程序及固定着色器
https://juejin.im/post/6844903843919052807一、OpenGL渲染流程如上图所表示的,管线分为上下2部分,上半部分是客户端,下半部分为服务器端。 服务端和客户端的功能和运行都是异步的,它们是各自独立的软件块和硬件块。在可编程管线中,我们能够编码的就是Vertex Shader(顶点着色器) 和Fragment Shader(片元着色器),这也是渲染过程中,必备的2个着色器。Vertex Shader:处理从客户端输入的数据、应用变换、进行其他的类型.原创 2020-08-12 14:46:26 · 487 阅读 · 0 评论 -
播放器的架构设计
https://blog.youkuaiyun.com/weixin_33691817/article/details/92285023原创 2020-08-12 09:56:39 · 377 阅读 · 0 评论 -
OpenGL/OpenGL ES 入门(一):图形API以及专业名词解析
http://www.cocoachina.com/articles/28754原创 2020-08-12 09:42:34 · 1161 阅读 · 0 评论 -
OpenGL ES 中的着色语言(Shading Language)
https://blog.youkuaiyun.com/u010029439/article/details/86677976一、着色语言基础原创 2020-08-08 14:27:26 · 682 阅读 · 0 评论 -
OpenGL/OpenGL ES入门:渲染YUV数据实践
1.yuv的字节数现有宽为w高为h的一个视频,现在定义了一个data[] bytes变量并存储了这个视频的一帧数据。bytes数组中,先连续存储每个像素的灰度信息,y通道占w*h个字节; 然后顺序存储颜色数据,u和v分别占一个字节,每个颜色数据共占2个字节,所以uv通道占(w/2)(h/2)2=w*h/2个字。2.纹理2.1 纹理的组成y通道的数据生成一个opengl纹理; uv通道的数据生成一个opengl纹理; 两个纹理作为渲染时的输入,在渲染过程中由GPU组装还原出来视频画面。原创 2020-08-07 17:29:32 · 5185 阅读 · 1 评论 -
多slice码流
现象在iOS平台的硬解的实践中,我们可能会遇到如下图的这种情况(上面一部分有画面,下面部分是绿屏):原因有的推流端出于编码性能的考虑,会选择通过切片的方式来编码,这样一个frame的数据就可能被切片分散于多个nalu中(哥伦布编码),但是videotoolbox解码又必须是整个frame合并到一个nalu中解码,暂时不知道合并算法,但是通过ffmpeg打开得到的流是合并过的(据说的熵编码)。例子下面是一个切片的裸流数据(PES包后的裸数据) 00 00 00 01 67 64..原创 2020-07-30 20:43:43 · 2933 阅读 · 0 评论 -
PS封装码流的解析
1.解析PS码流的流程图2.获取数据2.1 读取源码文件2.2 冗余数据处理3.解析数据3.1 解析PS Header3.2 解析 PS system header(可有可无)3.3 解析PS system map(I帧才会有)案例:3.4 解析PES包3.5 保存裸数据3.6 保存时间戳3.7 保存帧类型...原创 2020-07-30 19:50:53 · 6047 阅读 · 4 评论 -
OpenGL、WebGL和OpenCV的介绍和区别对比
和opencv类似,下载相应的库,就可以调用里面的接口来实现渲染功能。OpenGL规范描述了绘制2D和3D图形的抽象API。OpenGL有许多语言绑定,值得一提的包括:JavaScript绑定的WebGL(基于OpenGL ES 2.0在Web浏览器中的进行3D渲染的API);C绑定的WGL,GLX和CGL;iOS提供的C绑定;Android提供的Java和C绑定。OpenGL功能:具...原创 2020-02-25 19:25:37 · 2148 阅读 · 0 评论 -
码流的压缩编码,封装,解码,渲染,播放
1. 文件格式指电脑为了存储信息而使用的对信息的特殊编码方式,是用于识别内部储存的资料。比如有的储存图片,有的储存程序,有的储存文字信息。每一类信息,都可以一种或多种文件格式保存在电脑存储中。每一种文件格式通常会有一种或多种扩展名可以用来识别,扩但也可能没有扩展名。展名可以帮助应用程序识别的文件格式。常见的有AVI,MOV,MP4,AVC.2.文件封装格式将已经编码压缩好的视频轨和音频...原创 2020-03-30 20:01:02 · 1546 阅读 · 0 评论 -
常见的分辨率码流
4CIF:704*576 2CIF:704*288 DCIF:352*288 QCIF:176*144 VGA:640*480 SVGA:800*600 XVGA:1280*960 UXVGA:1600*1200 720P:1280*720 900P:1600*912 1080P:1920*1080 300W:2048*1536 500W:2592*1944 600W:3...原创 2020-03-30 19:27:03 · 8652 阅读 · 0 评论 -
音频中的PCM数据
设备采集的数据PCM--->编码---传输---->解析--->解码PCM(裸数据)--->渲染--->播放PCM数据介绍:pcm是裸数据,不带有任何编码格式的 pcm数据既是编码前的数据格式,也是解码后的数据格式。例如是aac编解码库, pcm --> aac 属于编码阶段, aac --> pcm属于解码阶段。 如果编解码是无损的话,先编...原创 2020-02-28 11:40:49 · 803 阅读 · 0 评论 -
音视频编解码原理-刘华平
https://www.cnblogs.com/imstudy/p/10289944.html转载 2020-01-08 10:03:10 · 511 阅读 · 0 评论