自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(522)
  • 资源 (26)
  • 问答 (1)
  • 收藏
  • 关注

原创 AvFrame和AvPacket

在FFmpeg中,未压缩的图像和压缩的视频码流分别使用AVFrame结构和AVPacket结构保存;针对视频编码器,其流程为从数据源获取图像格式的输入数据,保存为AVFrame对象并传入编码器,从编码器输出AVPacket结构。

2023-01-18 22:36:36 2151 1

原创 ffmpeg时间戳相关函数

ffmpeg中与时间戳相关的函数主要有:av_rescale_q,av_rescale_q_rnd,av_compare_ts。= 4);a0 += r;for(i = 63;i >= 0;a1 -= c;t1 ++;1= 4);a0 += r;for(i = 63;i >= 0;

2023-01-15 12:38:06 1151

原创 ffmpeg错误总结

chrono(201): error C2510: “_Duration”:“::”的左边必须是类/结构/联合。chrono(201): error C2061: 语法错误: 标识符“rep”在C++项目中,使用FFmpeg中的av_err2str函数时,报错。打开项目属性-> C/C++ -> 预处理器-> 预处理器定义。错误 C3861 “UINT64_C”: 找不到标识符。添加: __STDC_LIMIT_MACROS。“INTMAX_MAX”: 未声明的标识符。UINT64_C”: 找不到标识符。

2023-01-14 20:08:25 1803

原创 FFmpeg之av_err2str、av_ts_buff、av_ts2str、av_ts2timestr报错解决方案

【代码】FFmpeg之av_err2str、av_ts_buff、av_ts2str、av_ts2timestr报错解决方案。

2023-01-14 20:03:55 502

原创 FFmpeg源码分析: avformat_alloc_output_context2()

从代码中可以看出,av_guess_format()中使用一个整型变量score记录每种输出格式的匹配程度。函数中包含了一个while()循环,该循环利用函数av_oformat_next()遍历FFmpeg中所有的AVOutputFormat,并逐一计算每个输出格式的score。oformat:指定AVFormatContext中的AVOutputFormat,用于确定输出格式。format_name:指定输出格式的名称。av_guess_format()的代码如下所示。filename:文件的名称。

2023-01-10 23:21:30 510

原创 视频的基本知识

还有一点注意的,对于 IDR 帧来说,在 IDR 帧之后的所有帧都不能引用任何 IDR 帧之前的帧的内容,与此相反,对于普通的 I 帧来说,位于其之后的 B- 和 P- 帧可以引用位于普通 I- 帧之前的 I- 帧。B帧记录的是本帧与前后帧的差别(具体比较复杂,有4种情况),换言之,要解码B帧,不仅要取得之前的缓存画面,还要解码之后的画面,通过前后画面的与本帧数据的叠加取得最终的画面。P帧表示的是这一帧跟之前的一个关键帧(或P帧)的差别,解码时需要用之前缓存的画面叠加上本帧定义的差别,生成最终画面。

2022-12-28 23:52:41 611

原创 VAO, VBO, EBO的创建顺序和解绑顺序

修改其他VAO都需要调用glBindVertexArray,它会直接解绑旧的对象并且绑定一个新的,因此通常情况下,我们不需要通过调用 glBindVertexArray(0) 来解绑VAO,当然VBO也是这样。所以在使用中,无需过度在意是否解绑了VAO和VBO,通常是不需要解绑的。需要注意的是,当VAO处于活动状态时,不能解绑EBO, 因为绑定的元素缓冲区对象存储在VAO中。

2022-11-10 23:35:55 426

转载 [OpenGL] VAO、VBO、EBO

默认情况下,出于性能考虑,所有顶点着色器的属性(Attribute)变量都是关闭的,意味着数据在着色器端是不可见的,哪怕数据已经上传到GPU。绑定对象的过程就像设置铁路的道岔开关,每一个缓冲类型(比如GL_ARRAY_BUFFER)中的各个缓冲对象(比如生成了多个缓冲对象,ID为:123,322,111)就像不同的轨道一样,我们将开关设置为其中一个的状态(比如绑定123为GL_ARRAY_BUFFER),那么之后的列车(针对GL_ARRAY_BUFFER的改动)都会驶入这条轨道(123缓冲对象)。

2022-11-10 22:46:43 821

转载 掌握这些概念,不用担心看不懂OpenGL ES着色语言了

在OpenGL ES图形学中,着色语言(Shading Language)是一门必修课。在看openGL代码时,都会有着色语言的身影,它有自己的一套语法和格式。提供给我们进行编程的包括顶点着色器和片元着色器,它们都遵循着色语言语法,核心概念包括:向量、矩阵、变量、常量、运算符、采样器、布局限定符、精度限定符、插值限定符、输入输出限定符等。在顶点着色器中,我们一般看到attribute修饰符,称为属性变量;还有varying修饰符,称为易变变量,连接顶点着色器与片元着色器的桥梁。

2022-11-05 10:25:55 397

原创 FFmpeg源码分析:连接AVFilter的桥梁buffersrc与buffersink

FFmpeg在libavfilter模块提供音视频滤镜,而buffersrc与buffersink是连接AVFilter滤镜的桥梁。其中buffersrc是输入缓冲区,buffersink是输出缓冲区。通过调用av_buffersrc_add_frame_flags(),把待滤波的音视频帧推送到输入缓冲区;调用av_buffersink_get_frame_flags()从输出缓冲区取出滤波后的音视频帧。

2022-11-05 10:01:36 1014

原创 FFmpeg源码分析:AVFilterGraph与AVFilter

FFmpeg在libavfilter模块提供简单与复杂的音视频滤镜,所有滤波器由AVFilterGraph滤波器图表连接起来。简单滤镜为一对一输出,复杂滤镜为多对一输出。重要的结构体包括:AVFilterGraph、AVFilterLink、AVFilterContext、AVFilter。支持在滤波器图表指定位置插入AVFilter滤波器,然后由AVFilterLink把滤波器连接起来。

2022-11-05 09:32:12 800

转载 CUDA是什么-CUDA简介

CPU、GPUCPUCPU(Central Processing Unit)是一块超大规模的集成电路,是一台计算机的运算核心(Core)和控制核心( Control Unit)。它的功能主要是解释计算机指令以及处理计算机软件中的数据。CPU与内部存储器(Memory)和输入/输出(I/O)设备合称为电子计算机三大核心部件。CPU主要包括运算器(算术逻辑运算单元,ALU,Arithmetic Logic Unit)、控制单元(CU, Control Unit)、寄存器(Register)、和高速缓冲存储器

2022-11-03 23:04:09 32067

转载 Intel IPP图像库手册函数概述

ippiYCbCr420ToBGR_709CSC_8u_P3C3R: 将图像从YCbCr420空间转换BGR空间,ITU-RBT.709 CSC信号。ippiBGRToYCrCb420_709CSC_8u_AC4P3R: 将图像从YCbCr空间转换BGR空间,ITU-RBT.709 CSC信号。ippiYCbCrToBGR_709CSC_8u_P3C3R: 将图像从YCbCr空间转换BGR空间,ITU-RBT.709 CSC信号。

2022-11-02 23:22:23 2758

原创 OpenGL绘制方式

access表示对缓存对象的访问模式,通常是GL_MAP_INVALIDATE_RANGE_BIT,GL_MAP_INVALIDATE_BUFFER_BIT,GL_MAP_FLUSH_EXPLICIT_BIT,GL_MAP_UNSYNCHRONIZED_BIT中的一个或者多个组合,具体每个模式的定义参见OpenGL官方文档。access表示对缓存对象的访问模式,通常是GL_READ_ONLY(只读),GL_WRITE_ONLY(只写),GL_READ_WRITE(可读可写)中的一种。参数跟上面第6点一样。

2022-10-30 19:11:50 1595

原创 OpenGL着色器基础

由于着色器对象在同一时刻只能链接一次,这样当多个不同片段着色器需要处理同一个顶点着色器时,就必须把顶点着色器复制多分,然后多次绑定着色器程序,这样就造成资源的浪费和代码的重复。此时独立的着色器对象结合程序管线就可以解决上述问题。:着色器程序是多个着色器合并之后并最终链接完成的版本。已激活着色器程序的着色器将在我们发送渲染调用的时候被使用。:着色器是提供给用户定制自己特殊渲染需求的一套机制。:类似于C语言中的函数指针,主要用来实现子程序的动态选择。

2022-10-30 17:34:17 377

原创 OpenGL第三方库:GLAD入门篇

GLAD是继GL3W,GLEW之后,当前最新的用来访问OpenGL规范接口的第三方库。:任何的OpenGL接口调用都必须在初始化GLAD库后才可以正常访问。如果成功的话,该接口将返回GL_TRUE,否则就会返回GL_FALSE。:GLAD可以使OpenGL基础渲染变得十分简单,只需要简单四个步骤就可以完成基础渲染。4.使用着色器程序,利用渲染接口将缓冲对象按照指定图元类型渲染出来。:以下提供一个包含GLAD基础渲染操作的大部分接口的在线例子。:由于篇幅较多,已经另外写了一篇博客来记录。

2022-10-30 17:08:51 2422

原创 OpenGL第三方库:GLFW入门篇

前言:GLFW是继GLUT,FreeGLUT之后,当前最新的用来创建OpenGL上下文,以及操作窗口的第三方库。官方网址为:http://www.glfw.org/。错误处理机制:在使用GLFW之前,有必要设置一个错误处理机制,这样如果出现任何问题,GLFW都可以及时的告知我们。设置接口定义如下:GLFWWerrorfun* glfwSetErrorCallback(GLFWWerrorfun cbfunc)其中错误回调函数的声明如下所示:void ExampleGLFWerrorfun(int e

2022-10-30 16:36:47 1876

原创 OpenGL之gult/freeglut/glew/glfw/glad的联系与区别

opengl

2022-10-29 09:29:56 362

原创 SDL中的互斥量和条件变量

在最简单的音视频播放器中,由于解复用和解码是在不同的线程中,存放包的队列是公共资源,需要互斥。解复用向队列添加包,解码从队列取包,也需要同步。所以队列的入队和出队操作,采用了互斥量和条件变量。

2022-10-28 22:52:25 312

转载 条件变量详细解说

条件变量是用来等待线程而不是上锁的,条件变量通常和互斥锁一起使用。条件变量之所以要和互斥锁一起使用,主要是因为互斥锁的一个明显的特点就是它只有两种状态:锁定和非锁定,而条件变量可以通过允许线程阻塞和等待另一个线程发送信号来弥补互斥锁的不足,所以互斥锁和条件变量通常一起使用。当条件满足的时候,线程通常解锁并等待该条件发生变化,一旦另一个线程修改了环境变量,就会通知相应的环境变量唤醒一个或者多个被这个条件变量阻塞的线程。这些被唤醒的线程将重新上锁,并测试条件是否满足。一般来说条件变量被用于线程间的同步;

2022-10-27 23:05:39 421

转载 互斥锁(mutex)

Linux中提供一把每个线程在对资源操作前都尝试先加锁,成功加锁才能操作,操作结束解锁。但通过“锁”就将资源的访问变成互斥操作,而后与时间有关的错误也不会再产生了。但,应注意:同一时刻,只能有一个线程持有该锁。当A线程对某个全局变量加锁访问,B在访问前尝试加锁,拿不到锁,B阻塞。C线程不去加锁,而直接访问该全局变量,依然能够访问,但会出现数据混乱。所以,互斥锁实质上是操作系统提供的一把“建议锁”(又称“协同锁”),建议程序中有多线程访问共享资源的时候使用该机制。但,并没有强制限定。

2022-10-27 22:58:18 829

转载 OpenGL与显卡驱动

开发者通过图像编程接口发出渲染命令,这些渲染命令也就是DrawCall,只有显卡驱动知道如何和GPU通信,;正是因为显卡驱动的存在,显卡驱动会将接收到的渲染命令翻译成GPU能够理解的语言,也负责将纹理等数据转换成GPU所支持的格式,之后GPU才能懂OpenGL和DirectX,显卡驱动就像是一个中介,介于图形编程接口(OpenGL和DirectX)和GPU之间。可以将显卡驱动比喻是显卡的操作系统,是显卡的灵魂;

2022-10-26 00:16:39 2683

转载 glGenBuffers与glBindBuffer理解

首先要理解绑定缓冲类型后,所有该缓冲类型的函数调用都要用来配置该目标缓冲类型,比如顶点缓冲类型GL_ARRAY_BUFFER,glBufferData是通过指定目标缓冲类型来进行数据传输的,而每一个目标缓冲类型再使用前要提前绑定一个缓冲对象,从而赋予这个缓冲对象一个类型的意义,如果绑定了两个相同类型的目标缓冲,数据的配置肯定就会出错。第一个就是缓冲对象的类型,第二个参数就是要绑定的缓冲对象的名称,也就是我们在上一个函数里生成的名称,使用该函数将缓冲对象绑定到OpenGL上下文环境中以便使用。

2022-10-26 00:11:05 595

原创 glew和glfw区别

不同的显卡公司,也会发布一些只有自家显卡才支 持的扩展函数,你要想用这数涵数,不得不去寻找最新的glext.h,有了GLEW扩展库,你就再也不用为找不到函数的接口而烦恼,因为GLEW能自动识别你的平台所支持的全部OpenGL高级扩展函数。也就是说,只要包含一个glew.h头文件,你就能使用gl,glu,glext,wgl,glx的全部函数。一个轻量级的,开源的,跨平台的library。因为OpenGL没有窗口管理的功能,所以很多热心的人写了工具来支持这些功能,比如早期的glut,现在的freeglut等。

2022-10-25 23:27:13 1145

原创 FFmpeg源码分析:写媒体文件尾av_write_trailer()

其中muxer封装文件包括avformat_write_header()、av_write_frame()和av_write_trailer()。同样地,以mp4封装格式为例。结合前面的文章:avformat_write_header()写媒体文件头和av_write_frame()写媒体数据包,可以完整地实现muxer封装器。第1步的write_packets_from_bsfs和第2步的interleaved_write_packet在av_write_frame()文章有介绍。

2022-10-24 22:14:25 754

原创 FFmpeg源码分析:写媒体文件头avformat_write_header()

封装文件格式的主要API包括:avformat_write_header()写文件头,av_write_frame() / av_interleaved_write_frame()写音视频帧,av_write_trailer()写文件尾。任何封装器的私有选项必须通过选项参数传递到这个函数。FFmpeg在libavformat模块提供mux封装视频的API,包括avformat_write_header()写文件头、av_write_frame()写音视频帧、av_write_trailer()写文件尾。

2022-10-24 21:48:07 1285

原创 SDL-限制帧速

为了使这个程序不会运行的太快,每帧传输需要一定的时间,要求每秒显示20帧,那么每帧显示时间要不小于1/20秒。为了调整帧速率,我们首先要检查帧计时器的时间是否小于每帧传输所需时间。如果帧计时器时间大于每帧传输所需时间,就说明帧速率比要求的要低,这样我们就不需要进行限速调整了。如果帧计时器时间比每帧所需的时间少,那么我们就要用SDL_Delay()来进行延时,使帧速率符合要求。如果帧计时器是40毫秒,那么就要延时10毫秒(这样做的话,每帧相当于耗时50毫秒,帧传输速率就是20帧每秒)。

2022-10-20 22:33:58 240

转载 超分辨率概述

超分辨率(Super-Resolution)通过硬件或软件方法提高原有图像的分辨率,通过一幅或者多幅低分辨率的图像来得到一幅高分辨率的图像过程就是超分辨率重建,可以通过人工智能深度学习将低分辨率视频重建成高分辨率视频模糊图像、视频瞬间变高清,为移动端为用户带来极致视频体验。广义的超分辨率 (SR, Super Resolution) 是指一类用于提升图像分辨率的技术。这类技术已经存在了很长一段时间,应用也非常广泛。

2022-10-19 23:57:59 6608

原创 Windows Media Format SDK系统概述

如图 2.2是生成器大致的工作流程。另外,生成器本身不负责编码后的数据的最终去向,而是把这个任务交给了一种叫接收器(Sink)的对象,比如交给文件接收器就可以将数据保存为文件,交给网络接收器就可以将数据进行广播,交给推接收器就可以将数据分发到运行Windows Media Services的服务器上等等。Microsoft公司提供了Windows Media Format SDK,以支持以下三大功能:ASF文件的生成(包括ASF数据的流化)、ASF文件的编辑和ASF文件的播放(包括ASF媒体流的播放)。

2022-10-19 23:40:26 269

原创 PulseAudio 设计和实现浅析

标准的读写接口包括 snd_pcm_writei() / snd_pcm_readi() 和 snd_pcm_writen() / snd_pcm_readn()。PulseAudio 主页。PulseAudio 创建的一些概念和抽象的语义,如 pa_context,pa_stream,pa_iochannel,pa_pstream,pa_srbchannel,pa_sink,pa_sink_input,pa_source,pa_source_output,pa_module 和 pa_card 等等等。

2022-10-18 00:41:39 1569

原创 linux下使用PulseAudio获取扬声器的音量和是否静音

source device:source可以理解为源泉,表示声音的源,即声音产生的地方。那么就可以理解为声音从source device流出,流到sink device里面。sink device:sink可以理解为水槽,表示声音的接受一方。

2022-10-17 22:50:21 798

原创 SDL 开发实战(五): SDL 纹理渲染

本文我们讲一下如何使用SDL_Texture将视频纹理渲染出来。

2022-10-15 18:10:44 848

原创 SDL 开发实战(四): SDL 事件处理

在前面学习SDL的例子运行时,我们发现我们的窗口只停留了几秒,但是如果设置更长时间显然也有其他的弊端。那么有没有一种好的办法可以解决这个问题呢?例如:能不能让窗口一直显示,直到检测到用户用鼠标点击关闭按钮后才关闭呢?答:显然可以!下面就来介绍一下SDL的事件处理机制。

2022-10-15 18:03:04 1374

原创 SDL 开发实战(三):使用 SDL 绘制基本图形

本文我们来讲一下,如何使用SDL的API绘制基本的图形。SDL中绘制基本图形的 API并不多,主要是 点、线、矩形、填充矩形。其它图形都可以通过 点、线、矩形组合出来。

2022-10-15 17:58:18 1582 1

原创 SDL 开发实战(二):SDL 2.0 核心 API 解析

基本的SDL的使用思路,基本分为三部分:初始化 —> 循环渲染 —> 销毁释放资源。下面我们就按照这个顺序对核心的API进行讲解。

2022-10-15 16:16:45 1089

原创 SDL 开发实战(一):SDL介绍

SDL是 “Simple DirectMedia Layer”的缩写,SDL是一个开源的跨平台的多媒体库,封装了复杂的音视频底层操作,简化了音视频处理的难度。SDL使用C语言写成,提供了数种控制图像、声音、输出入的函数,可以开发出跨多个平台(Linux、Windows、Mac OS X等)的应用软件。目前多用于开发游戏、模拟器、媒体播放器等多媒体应用领域。

2022-10-15 15:57:56 2129

原创 ffmpeg time_base

ffmpeg存在多个时间基准(time_base),对应不同的阶段(结构体),每个time_base具体的值不一样,ffmpeg提供函数在各个time_base中进行切换。搞清楚各个time_base的来源,对于阅读ffmpeg的代码很重要。

2022-10-15 14:36:58 1080

转载 FFmpeg时间戳详解

例如,如果一个视频帧的dts是40,pts是160,其time_base是1/1000秒,那么可以计算出此视频帧的解码时刻是40毫秒(40/1000),显示时刻是160毫秒(160/1000)。在闭合式GOP中,每个GOP的第一个帧一定是I帧,且当前GOP的数据不会参考前后GOP的数据。根据注释中的建议,实际使用时,在视频解码过程中,我们不使用AVCodecContext.time_base,而用帧率倒数作时间基,在视频编码过程中,我们将AVCodecContext.time_base设置为帧率的倒数。

2022-10-15 12:08:41 2023

原创 理解ffmpeg中的pts,dts,time_base

非压缩时候的数据(即YUV或者其它),在ffmpeg中对应的结构体为AVFrame,它的时间基为AVCodecContext 的time_base ,AVRational{1,25}。压缩后的数据(对应的结构体为AVPacket)对应的时间基为AVStream的time_base,AVRational{1,90000}。如果把1秒分为25等份,你可以理解就是一把尺,那么每一格表示的就是1/25秒。如果你是把1秒分成90000份,每一个刻度就是1/90000秒,此时的time_base={1,90000}。

2022-10-14 00:04:59 490

原创 FFmpeg源码分析:av_parser_parse2()解析数据包

在FFmpeg的libavcodec模块提供解析数据包和编解码功能。其中,av_parser_parse2()函数用来解析数据包,在使用av_read_frame()读取音视频帧时,会调用到该函数进行数据包解析。文章。

2022-10-10 00:26:46 613

毕业答辩ppt模板(答辩必备,效果很炫)

毕业答辩ppt模板,答辩必备,效果很炫,给人耳目一新的感觉。

2011-06-12

流程图生成软件(适合初学者学习流程图)

流程图生成软件(适合初学者学习流程图),非常实用,简单

2011-05-28

二进制编辑器(查看.exe文件的内存中的具体二进制存储)

二进制编辑器,用于查看.exe文件的内存中的具体二进制存储。

2011-05-28

.dll文件查看器,直接阅读dll文件

.dll文件查看器,可直接阅读dll文件,非常实用的工具软件

2011-05-27

ACM题解,著名院校oj解题代码

ACM题解,著名院校oj解题代码,对ACmer非常有用

2011-05-27

数据结构代码(严蔚敏版C实现)

数据结构代码,用于深入理解数据结构和算法

2011-05-27

经典数学函数程序(C语言实现)

经典数学函数程序,可用于相关的数学方面的研究

2011-05-27

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除