自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(84)
  • 收藏
  • 关注

原创 acwing算法基础课模版分析

基础算法快排模版模版分析:整数二分算法模版分析:这个算法一般是用来求开方后的结果的!!用一个例题来理解!给你一个数字x,请你求根号x的结果,保留六位小数!模版分析:举个例子你就知道什么叫前缀和了,已知原数组是a(下标从1开始,0位置数值为0),前缀和数组是s,s[i]=a[0]+a[1]+…+a[i],这就是前缀和!!!前缀和的好处是当你频繁计算区间和时,支持O(1)复杂度计算!性质:求[L,R]区间和=>s[R]-S[L-1]看图分析:性质:求以(x1, y1)为左上角,(x

2022-10-03 00:30:43 2695 5

原创 ffplay播放器剖析(8)----逐帧/音量调节/快进快退/倍数分析

就是SDL_MixAudioFormat调用audio_volume进行修改音量,一开始是都初始化为0,如果不是静音的话那么就修改音量,否则就是0给SDL输出,因此可以得知静音只需要初始化为0即可!快进之前先获取上一帧pts然后赋值给pos,incr是快进时间,如果通过码流算出对应的是位置,然后pos加上incr后通过stream_seek进行seek。不同的方案是由flags来确定的,当我们使用avformat_seek_file时会传入flags,然后avformat_seek_file会自己判断。

2023-07-24 22:21:02 433

原创 ffplay播放器剖析(7)----音视频暂停模块分析

2.toggle_pause调用stream_toggle_pause。这个函数可以知道,如果当前状态是暂停的话,那么就会进入if函数。3.stream_toggle_pause修改暂停变量。get_clock当是暂停状态时就是获取时钟的pts。1.通过SDL触发事件调用toggle_pause。这个就是在之前的基础上加上暂停到开始的时间。看一下if函数流程,首先我们知道我们。就是将paused取反。同理是设置外部时钟的。

2023-07-24 19:45:58 859

原创 ffplay播放器剖析(6)----音视频同步分析

具体以什么为基准时就是看你设置的参数,然后通过get_master_clock来获取主时钟,因此3大时钟都会 设置!!!if(!

2023-07-24 15:00:24 885

原创 ffplay播放器剖析(5)----视频输出剖析

首先判断pictq是否为空(调用frame_queue_nb_remaining判断是否还有未显示的帧),如果为空则继续调用video_display显示上一帧。本质就是通过上一帧和待显示帧pts来计算的,如果考虑到同步,则还需要考虑当前与主时钟的差距来决定是重复上一帧,还是丢帧,还是正常显示下一帧(待显示帧)frame中的像素格式是FFmpeg中定义的像素格式,FFmpeg中定义的很多像素格式与SDL中定义的像素格式是同一种格式,只不过是名称不同。

2023-07-21 16:40:13 579

原创 ffplay播放器剖析(4)----音频输出和音频重采样流程

audio_decode_frame函数就是冲FrameQueue中获取Frame数据,然后判断是否需要重采样(下面详解,这边忽略),然后将audio_buf指向帧中的buff,这里可以看出audio_buf并不是直接申请一段空间,而是直接复用帧的缓冲区而已,在audio_open中,通过SDL_OpenAudioDevice注册sdl_audio_callback函数为音频输出的回调函数,这样音频输出的总逻辑就是sdl_audio_callback了。

2023-07-20 18:37:43 413

原创 ffplay播放器剖析(3)----解码线程剖析

通过decoder_decode_frame读取到帧后,对该帧进行判断是否要丢弃,原理就说看视频帧和其他帧同步的差值为多少,get_master_clock就说获取其他帧的pts,然后和当前视频帧的pts差值就说diff,然后通过判断条件是否选择丢弃。主要是通过get_video_frame获取到frame,并且计算出真正的pts,duration,然后通过queue_picture插入到frame视频队列中去。因为真正读取帧的函数是decoder_decode_frame,由该函数控制帧类型的.

2023-07-18 16:27:18 100

原创 ffplay播放器剖析(2)----读取线程刨析

通过流的编码器信息赋值给编码器上下文后,通过其解码器信息中的id通过avcodec_find_decoder查找编码器,然后如果用户指定编码器的话,就通过avcodec_find_decoder_by_name使用用户指定的解码器,然后调用avcodec_open2打开解码器.stream_start_time是获取流的起始时间,pkt_ts是当前pkt的pts,pkt_in_play_range就是判断该pkt是否在时间时间范围内部。

2023-07-17 20:03:14 333

原创 ffplay播放器剖析(1)----数据结构剖析

ffplay是FFmpeg源码提供的一个播放器,它是由FFmpeg和SDL的API实现的播放器,对后续播放器的二次开发有着借鉴意义,比如哔哩哔哔哩的ijkplayer.

2023-07-16 20:04:31 283

原创 音视频编码实战-------pcm+yuv数据转成MP4

avcodec_parameters_from_context:将编码器上下文中的参数拷贝到音视频流中的编码器参数中AVCodecParameters。编码器上下文的flags要设置一下AV_CODEC_FLAG_GLOBAL_HEADER这个参数,不然的话很多视频播放器是播放不了的,尤其是视频流。av_packet_alloc得到的数据必须要设置stream_index,不然stream_index都默认为0了。swr_alloc_set_opts:设置重采样配置参数,并且分配重采样器上下文。

2023-07-12 21:38:10 1240

原创 视频编码流程 YUV数据编码为H264数据

视频编码时,设置编码器上下文参数有:码率,宽,高,格式,帧率等。通常使用av_image_get_buffer_size来计算。然后计算一帧的数据:宽 * 高 * 格式占用字节数。av_opt_set就是用来设置参数的。frame设置:宽,高,格式。

2023-07-08 18:28:53 1029

原创 音频编码流程 ----- PCM编码为AAC格式

确保帧数据可写,尽可能避免数据复制.如果帧可写,则不执行任何操作,如果不可写,则分配新缓冲区并复制数据.返回: 成功时为 0,错误时为负 AVERROR.这个函数就是将你输入的一帧数据写入AVFrame格式输出,便于后面编码send,recvice使用。

2023-07-08 16:07:25 1342

原创 AVIO内存输入模式

创建AVIOContext,然后创建AVFormatContext,将AVIOContext绑定到AVFormatContext->pb,最后调用avformat_open_input函数即可,只不过这时avformat_open_input函数的第二个参数url就不用传了,直接传入NULL即可。write_packet:是写入的钩子函数,当需要写入时调用该函数。read_packet:是读取的钩子函数,当需要读取时调用该函数。seek:是随机访问的钩子函数,当需要随机访问时调用该函数。

2023-06-23 21:41:42 164

原创 音视频解码流程解析

文章目录1.音频解码过程2.FFmpeg解音频流程3.关键函数说明1.音频解码过程2.FFmpeg解音频流程3.关键函数说明avcodec_find_decoder:根据指定AVCodecID查找注册的解码器av_parser_init:初始化AVCodecParserContextavcodec_alloc_context3:创建AVCodecContext上下文avcodec_open2:将解码器和解码器上下文进行关联av_parser_parse2:解析获得一个AVPacket

2023-06-23 21:08:04 696

原创 FLV格式分析

FLV(Flash Video)是Adobe公司推出的一种流媒体格式,由于其封装后的音视频简单等特点,非常使用于互联网的使用. 目前主流的视频网站基本上都支持FLV,其格式封装的文件后缀为.flv。

2023-06-23 19:58:00 943

原创 H264 NALU分析

H.264从1999年开始,到2003年形成草案,最后在2007年定稿有待核实。在ITU的标准⾥称为H.264,在MPEG的标准⾥是MPEG-4的⼀个组成部分–MPEG-4 Part 10,⼜叫Advanced Video Codec,因此常常称为MPEG-4 AVC或直接叫AVC。

2023-06-17 21:20:32 633

原创 AAC ADTS格式分析

AAC音频格式:Advanced Audio Coding(⾼级⾳频解码),是⼀种由MPEG-4标准定义的有损⾳频压缩格式,由Fraunhofer发展,Dolby, SonyAT&T是主要的贡献者。ADIF:Audio Data Interchange Format ⾳频数据交换格式。这种格式的特征是可以确定的找到这个⾳频数据的开始,不需进⾏在⾳频数据流中开始的解码,即它的解码必须在明确定义的开始处进⾏。故这种格式常⽤在磁盘⽂件中。ADTS的全称是Audio Data Transport Stream。

2023-06-16 20:25:46 1187

原创 FFmpeg 内存模型分析

有了前面的知识铺垫,不难分析出read_frame_internal是调用ff_packet_list_put来获取AVPacket的,但是这里要注意ff_packet_list_put并不是简单的将AVPacket给read_frame_internal。我们解复用后,媒体流数据就会被分离开来,分别生成对应AVPacketList,然后通过av_read_frame读取一个AVPacket来读取,然而如果有一个新的AVPacket也想要指向之前的AVPacket,那么内存模型应该是什么样子的呢?

2023-06-16 00:18:15 1166

原创 FFmpeg编程入门

•AVUtil:核心工具库,下面的许多其他模块都会依赖该库做一些基本的音视频处理操作。•AVFormat:文件格式和协议库,该模块是最重要的模块之一,封装了Protocol层和Demuxer、Muxer层,使得协议和格式对于开发者来说是透明的。•AVCodec:编解码库,封装了Codec层,但是有一些Codec是具备自己的License的,FFmpeg是不会默认添加像libx264、FDK-AAC等库的,但是FFmpeg就像一个平台一样,可以将其他的第三方的Codec以插件的方式。

2023-06-14 00:09:11 1038 2

原创 FFmpeg命令实战(中)

ffmpeg -i test.mp4 -r 15 -codec copy output.mp4 (错误命令,没有改变帧率)保留编码格式:ffmpeg -i test.mp4 -vcodec copy -an test_copy.h264。强制格式:ffmpeg -i test.mp4 -vcodec libx264 -an test_h264.mp4。保留编码格式:ffmpeg -i test.mp4 -acodec copy -vn test.aac。

2023-05-22 01:39:13 472

原创 FFmpeg命令实战(上)

这里有两个压缩包,ffmpeg-master-latest-win64-gpl-shared这个里面包含了ffmpeg的lib文件,可以进行ffmpeg的二次开发,ffmpeg-master-latest-win64-gpl只包含了ffmpeg的工具。-codec:media_specifier codec_name 强制使用设置的多媒体解码器,media_specifier可用值为a(音频), v(视频)和s字幕。-bytes 按字节进行定位拖动(0=off 1=on -1=auto)。

2023-05-20 02:35:55 1350

原创 UDP总结

操作系统是由C语言写的,而UDP属于操作系统,那么UDP也一定是C语言编写的,UDP其实就是一个位段类型。UDP具有接收缓冲区,但是不能保证发送的顺序和接受的顺序相同,接收缓冲区满了再收到UDP报文就会丢弃。UDP最大长度是16位,那么UDP报文大小最大是2^16字节,也就是64K。UDP没有真正意义上的发送缓冲区,而是直接交给内核,由内核交给网络层协议。UDP如何决定将有效载荷交付给上层的哪一个协议?UDP如何将报头和有效载荷分离?UDP是全双工的,能读能写。基于UDP的应用层协议。

2023-03-15 21:35:59 348

原创 TCP思维导图总结

拥塞控制:为了解决这种问题,采取了慢启动的机制,就是一开是发生少量数据探路,摸清网络状况,在决定按照多大的速度进行传输,而慢启动的大小就是拥塞窗口的大小,所以滑动窗口配合窗口大小和拥塞窗口就可以很好的控制发送速度。滑动窗口本质上就是两个整数来维护一段区间,我们假设记为left和right,left的左边是已经成功发送过去的数据,right的右边是待发送的数据,而这区间内是可能发送但是没收到应答或者待发送的数据。TCP为了保证发送效率,采取了连续发送多个数据的策略,而保证这个策略的机制叫做滑动滑动窗口。

2023-03-15 21:32:46 423

原创 蓝桥杯第二次模拟赛题解

答案: 2048B:数天数答案:26390C:非常特殊的数答案:1038D:最大值路径答案: 592E:拆分质数个数答案: 33F:文件拷贝问题描述:小蓝正在拷贝一份文件,他现在已经拷贝了 t 秒时间,已经拷贝了 c 字节,文件总共有 s 字节,如果拷贝是匀速进行的,请问小蓝大概还需要拷贝多少秒?输入格式:输入一行包含三个整数 t, c, s,相邻两个整数之间用一个空格分隔。

2022-12-05 00:29:08 323

原创 C++:了解vector类

vector是表示可变大小数组的序列容器。就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。本质讲,vector使用动态分配数组来存储它的元素。当新元素插入时候,这个数组需要被重新分配大小为了增加存储空间。其做法是,分配一个新的数组,然后将全部元素移到这个数组。就时间而言,这是。...

2022-08-18 16:53:45 301 1

原创 [手撕STL] string类

本文将string类中一些主要的函数模拟出来!

2022-08-15 17:26:43 332 1

原创 C++:了解string类

出现。当指定pos时,搜索仅包括位置pos或之后的字符,忽略任何可能出现的包括pos之前的字符。

2022-08-14 19:30:24 991 3

原创 了解STL(标准模板库)

是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包括数据结构与算法的软件框架。

2022-08-12 22:19:56 277

原创 模板---初阶

template < class T1 , class T2 , . . . , class Tn > class 类模板名 {// 类内成员定义 };// 动态顺序表 // 注意:Vector不是具体的类,是编译器根据被实例化的类型生成具体类的模具 template < class T > class Vector {public :} // 使用析构函数演示:在类中声明,在类外定义。};...

2022-08-12 22:13:24 161

原创 C++内存管理

new的原理调用operator new函数申请空间在申请的空间上执行构造函数,完成对象的构造delete的原理在空间上执行析构函数,完成对象中资源的清理工作调用operator delete函数释放对象的空间new T[N]的原理调用operator new[]函数,在operator new[]中实际调用operator new函数完成N个对象空间的申请在申请的空间上执行N次构造函数delete[]的原理。...

2022-08-12 14:50:12 171

原创 C++类和对象(下)

这就很好的解释了构造函数体是赋初值,而初始化列表才是初始化,当你不写对应的初始化列表的时候就会调用对应的默认构造,所以再没有初始化列表的时候,自定义对象必须得有默认构造,当你使用了初始化列表后,只需要对应的自定义对象有其对应的构造方法即可!比如上述Time类和Date类,在Time类中声明Date类为其友元类,那么可以在Date类中直接访问Time类的私有成员变量,但想在Time类中访问Date类中私有的成员变量则不行。内部类是一个独立的类,它不属于外部类,更不能通过外部类的对象去访问内部类的成员。...

2022-08-10 19:58:38 206 9

原创 日期类相关代码

Date.c用来实现函数。Date.h用来声明。Test.c用来测试。

2022-08-10 13:28:37 254 1

原创 C++类和对象(中)

若未显式定义,编译器会生成默认的拷贝构造函数。默认的拷贝构造函数对象按内存存储按字节序完成拷贝,这种拷贝叫做浅拷贝,或者值拷贝。

2022-08-09 19:33:10 168 1

原创 Linux基础开发工具学习

一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。我们的C程序中,并没有定义“printf”的函数实现,且在预编译中包含的“stdio.h”中也只有该函数的声明,而没有定义函数的实现,那么,是在哪里实“printf”函数的呢?..

2022-07-30 23:33:13 1956 8

原创 Linux权限相关概念

目录的可执行权限是表示你可否在目录下执行命令。如果目录没有-x权限,则无法对目录执行任何命令,甚至无法cd进入目,即使目录仍然有-r读权限(这个地方很容易犯错,认为有读权限就可以进入目录读取目录下的文件)而如果目录具有-x权限,但没有-r权限,则用户可以执行命令,可以cd进入目录。但由于没有目录的读权限所以在目录下,即使可以执行ls命令,但仍然没有权限读出目录下的文档httpshttpshttpshttps。...

2022-07-28 19:15:16 225 10

原创 C++类和对象(上)

..//类体由成员函数和成员变量组成};class为定义类的关键字,ClassName为类的名字,{}中为类的主体,注意类定义结束时分号不能省略.类体中内容为类的成员类中的变量称为类的属性或成员变量;类中的函数称为类的方法或成员函数.声明和定义全部放在类体中,需注意成员函数如果在类中定义,编译器可能会将其当成内联函数处理。public}public。...

2022-07-22 18:03:41 322 2

原创 Linux常用指令总结

a或–all详细输出所有信息,依次为内核名称,主机名,内核版本号,内核版本,硬件名,处理器类。date-s“0101012008-05-23″//这样可以设置全部时间。date-s“2008-05-23010101″//这样可以设置全部时间。date-s“01010120080523″//这样可以设置全部时间。date-s“20080523010101″//这样可以设置全部时间。date-s//设置当前时间,只有root权限才能设置,其他只能查看。...

2022-07-20 21:42:56 1113 8

原创 C++入门

在C++中给了一个namespace这个关键字,这个关键字弥补了C语言的一个缺陷,我们试想一下,在公司中众多人完成一个工程,那么此时有人设置了 相同的变量,相同的函数名改怎么区分呢?? 于是有了命名空间这个概念,我们可以通过不同的命名空间创建相同的变量名或者函数名!ps:1.加命名空间名称及作用域限定符2.使用using将命名空间中成员引入3.使用using namespace 命名空间名称引入2.缺省参数缺省参数是声明或定义函数时为函数的参数指定一个默认值。在调用该函数时,如果没有指定实参则采用

2022-07-17 18:33:04 548 8

原创 欧拉筛(代码详解)

欧拉筛法

2022-07-13 11:00:03 692 1

原创 javase----内部类

内部类就是把一个类定义在一个类的内部内部类的种类:分两种情况:局部内部类(本地内部类):定义在方法中的类.只能在方法中使用,出了方法就无法使用,所以称为局部内部类原因:因为方法无法像类一样直接调用成员3.成员内部类成员内部类也叫实例内部类,可以把他当做外部类的一个平台实例成员注意:1.在实例内部类中,不能创建一个静态成员变量因为静态成员变量在类加载的时候就会创建,我们正常情况下我们可以直接通过类来访问静态对象而不需要去实例化对象,但是当他在实例内部类中就不能创建,因为内部类无法直接通过外部类

2022-06-30 17:26:15 242 3

空空如也

空空如也

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

TA关注的人

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