为了方便各位观看,本文置顶,以目录形式汇集我写过的大部分音视频专题文章。之后文章更新,本目录也会同步更新。写得不好和零零散散的文章就不放在这里了😅 :
=================================================================
音视频入门基础:像素格式专题系列文章:
音视频入门基础:像素格式专题(2)——不通过第三方库将RGB24格式视频转换为BMP格式图片
音视频入门基础:像素格式专题(3)——FFmpeg源码解析BMP格式图片的底层实现原理
音视频入门基础:像素格式专题(5)——使用OpenGL实现yuv420p转rgb播放视频(三重纹理实现)
=================================================================
=================================================================
音视频入门基础:H.264专题系列文章:
通过本系列,可以对AnnexB和avcC包装的H.264格式有一个基本了解,学会如何阅读H.264官方文档,以及如何通过SPS中的属性得到视频信息:
音视频入门基础:H.264专题(1)——H.264官方文档下载
音视频入门基础:H.264专题(2)——使用FFmpeg命令生成H.264裸流文件
音视频入门基础:H.264专题(3)——EBSP, RBSP和SODB
音视频入门基础:H.264专题(4)——NALU Header:forbidden_zero_bit、nal_ref_idc、nal_unit_type简介
音视频入门基础:H.264专题(5)——FFmpeg源码中 解析NALU Header的函数分析
音视频入门基础:H.264专题(6)——FFmpeg源码:从H.264码流中提取NALU Header、EBSP、RBSP和SODB
音视频入门基础:H.264专题(7)——FFmpeg源码中 指数哥伦布编码的解码实现
音视频入门基础:H.264专题(8)——H.264官方文档的描述符
音视频入门基础:H.264专题(10)——FFmpeg源码中,存放SPS属性的结构体和解码SPS的函数分析
音视频入门基础:H.264专题(11)——计算视频分辨率的公式
音视频入门基础:H.264专题(12)——FFmpeg源码中通过SPS属性计算视频分辨率的实现
音视频入门基础:H.264专题(13)——FFmpeg源码中通过SPS属性获取视频色彩格式的实现
音视频入门基础:H.264专题(14)——计算视频帧率的公式
音视频入门基础:H.264专题(15)——FFmpeg源码中通过SPS属性获取视频帧率的实现
音视频入门基础:H.264专题(16)——FFmpeg源码中,判断某文件是否为H.264裸流文件的实现
音视频入门基础:H.264专题(17)——FFmpeg源码中,获取H.264视频的profile的实现
音视频入门基础:H.264专题(18)——FFmpeg源码获取H.264裸流文件信息(视频压缩编码格式、色彩格式、视频分辨率、帧率)的总流程
音视频入门基础:H.264专题(19)——AVCDecoderConfigurationRecord简介
音视频入门基础:H.264专题(20)——FFmpeg源码中,获取avcC封装的H.264码流中每个NALU的长度的实现
音视频入门基础:H.264专题(21)——FFmpeg源码中,解码AVCDecoderConfigurationRecord的实现
音视频入门基础:H.264专题(22)——通过FFprobe显示H.264裸流每个packet的信息
=================================================================
=================================================================
音视频入门基础:PCM专题系列文章:
音视频入门基础:PCM专题(1)——使用FFmpeg命令生成PCM音频文件并播放
音视频入门基础:PCM专题(2)——使用Qt播放PCM音频文件
音视频入门基础:PCM专题(3)——使用Audacity工具分析PCM音频文件
=================================================================
=================================================================
音视频入门基础:WAV专题系列文章:
FFmpeg这个库很大很重,所以很多同学会选择不依赖任何第三方库自己写解析媒体文件头的代码,可是自己写的解析demo真的比第三方库做得更好吗?比如WAV这种文件格式,它的文件头结构非常简单,但还存在可能包含扩展块和可选区块的情况;它可能遵守RIFF格式的规则,也可能遵守RIFX格式的规则;ACT音频格式可能会包含一个标准的WAV文件头所以要防止误判的情况;然后还有WAVE 64位扩展格式Wave64......自己写解析代码真的考虑清楚所有的情况了吗?所以在不完全了解清楚一种文件格式之前,参考FFmpeg等第三方库的解析部分是一个比较好的选择,本系列以WAV音频文件为例介绍如何对媒体文件的文件头进行解析:
音视频入门基础:WAV专题(1)——使用FFmpeg命令生成WAV音频文件
音视频入门基础:WAV专题(3)——FFmpeg源码中,判断某文件是否为WAV音频文件的实现
音视频入门基础:WAV专题(4)——FFmpeg源码中获取WAV文件音频压缩编码格式、采样频率、声道数量、采样位数、码率的实现
音视频入门基础:WAV专题(5)——FFmpeg源码中解码WAV Header的实现
音视频入门基础:WAV专题(6)——通过FFprobe显示WAV音频文件每个数据包的信息
音视频入门基础:WAV专题(7)——FFmpeg源码中计算WAV音频文件每个packet的size值的实现
音视频入门基础:WAV专题(8)——FFmpeg源码中计算WAV音频文件AVStream的time_base的实现
音视频入门基础:WAV专题(9)——FFmpeg源码中计算WAV音频文件每个packet的duration和duration_time的实现
音视频入门基础:WAV专题(10)——FFmpeg源码中计算WAV音频文件每个packet的pts、dts的实现
音视频入门基础:WAV专题(11)——FFmpeg源码中计算WAV音频文件每个packet的pts_time、dts_time的实现
=================================================================
=================================================================
音视频入门基础:AAC专题系列文章:
音视频入门基础:AAC专题(2)——使用FFmpeg命令生成AAC裸流文件
音视频入门基础:AAC专题(3)——AAC的ADTS格式简介
音视频入门基础:AAC专题(4)——ADTS格式的AAC裸流实例分析
音视频入门基础:AAC专题(5)——FFmpeg源码中,判断某文件是否为AAC裸流文件的实现
音视频入门基础:AAC专题(6)——FFmpeg源码中解码ADTS格式的AAC的Header的实现
音视频入门基础:AAC专题(7)——FFmpeg源码中计算AAC裸流每个packet的size值的实现
音视频入门基础:AAC专题(8)——FFmpeg源码中计算AAC裸流AVStream的time_base的实现
音视频入门基础:AAC专题(9)——FFmpeg源码中计算AAC裸流每个packet的duration和duration_time的实现
音视频入门基础:AAC专题(10)——FFmpeg源码中计算AAC裸流每个packet的pts、dts、pts_time、dts_time的实现
音视频入门基础:AAC专题(11)——AudioSpecificConfig简介
音视频入门基础:AAC专题(12)——FFmpeg源码中,解码AudioSpecificConfig的实现
=================================================================
=================================================================
音视频入门基础:FLV专题系列文章:
音视频入门基础:FLV专题(2)——使用FFmpeg命令生成flv文件
音视频入门基础:FLV专题(3)——FLV header简介
音视频入门基础:FLV专题(4)——使用flvAnalyser工具分析FLV文件
音视频入门基础:FLV专题(5)——FFmpeg源码中,判断某文件是否为FLV文件的实现
音视频入门基础:FLV专题(6)——FFmpeg源码中,解码FLV header的实现
音视频入门基础:FLV专题(7)——Tag header简介
音视频入门基础:FLV专题(8)——FFmpeg源码中,解码Tag header的实现
音视频入门基础:FLV专题(9)——Script Tag简介
音视频入门基础:FLV专题(10)——Script Tag实例分析
音视频入门基础:FLV专题(11)——FFmpeg源码中,解析SCRIPTDATASTRING类型的ScriptDataValue的实现
音视频入门基础:FLV专题(12)——FFmpeg源码中,解析DOUBLE类型的ScriptDataValue的实现
音视频入门基础:FLV专题(13)——FFmpeg源码中,解析任意Type值的SCRIPTDATAVALUE类型的实现
音视频入门基础:FLV专题(14)——FFmpeg源码中,解码Script Tag的实现
音视频入门基础:FLV专题(15)——Video Tag简介
音视频入门基础:FLV专题(16)——FFmpeg源码中,解码Video Tag的VideoTagHeader的实现
音视频入门基础:FLV专题(17)——FFmpeg源码中,提取Video Tag的VIDEODATA的实现
音视频入门基础:FLV专题(18)——Audio Tag简介
音视频入门基础:FLV专题(19)——FFmpeg源码中,解码Audio Tag的AudioTagHeader,并提取AUDIODATA的实现
音视频入门基础:FLV专题(20)——FFmpeg源码中,获取FLV文件major_brand、minor_version、compatible_brands、encoder、Duration的实现
音视频入门基础:FLV专题(21)——FFmpeg源码中,获取FLV文件音频信息的实现(上)
音视频入门基础:FLV专题(22)——FFmpeg源码中,获取FLV文件音频信息的实现(中)
音视频入门基础:FLV专题(23)——FFmpeg源码中,获取FLV文件音频信息的实现(下)
音视频入门基础:FLV专题(24)——FFmpeg源码中,获取FLV文件视频信息的实现
音视频入门基础:FLV专题(25)——通过FFprobe显示FLV文件每个packet的信息
=================================================================
=================================================================
FFmpeg内存管理相关的源码分析:
FFmpeg内存管理使用了C语言的设计艺术,比如AVBufferRef和AVBuffer结构体模仿了C++,使用了引用计数来解决使用浅拷贝可能造成的资源重复释放问题,通过引入引用计数:增加一个变量(比如AVBuffer中的refcount),记录资源使用的次数,控制资源的释放:
FFmpeg中内存分配和释放相关的源码:av_malloc函数、av_mallocz函数、av_free函数和av_freep函数分析
FFmpeg源码:av_realloc、av_reallocp、size_mult、av_realloc_f函数分析
FFmpeg引用计数数据缓冲区相关的结构体:AVBuffer、AVBufferRef简介
FFmpeg源码:buffer_create、av_buffer_create、av_buffer_default_free、av_buffer_alloc、av_buffer_allocz函数分析
FFmpeg源码:av_buffer_ref、av_buffer_unref函数分析
FFmpeg源码:av_buffer_is_writable、av_buffer_realloc函数分析
FFmpeg源码:av_malloc_array、av_realloc_array函数分析
=================================================================
=================================================================
AVPacket结构体和其相关的函数分析:
FFmpeg存放压缩后的音视频数据的结构体:AVPacket简介
FFmpeg源码:av_init_packet、get_packet_defaults、av_packet_alloc函数分析
FFmpeg源码:av_packet_free_side_data、av_packet_unref、av_packet_free函数分析
FFmpeg源码:packet_alloc、av_new_packet、av_shrink_packet、av_grow_packet函数分析
FFmpeg源码:av_packet_move_ref、av_packet_make_refcounted函数分析
FFmpeg源码:PacketList结构体、avpriv_packet_list_put、avpriv_packet_list_get、avpriv_packet_list_free函数分析
FFmpeg源码:append_packet_chunked、av_get_packet、av_append_packet函数分析
FFmpeg中调用av_read_frame函数导致的内存泄漏问题
=================================================================
=================================================================
AVIOContext结构体和其相关的函数分析:
FFmpeg源码:avio_r8、avio_rl16、avio_rl24、avio_rl32、avio_rl64函数分析
FFmpeg源码:read_packet_wrapper、fill_buffer函数分析
FFmpeg源码:ffurl_seek2、ffurl_seek、avio_size函数分析
=================================================================
=================================================================
AVRational结构体和其相关的函数分析:
FFmpeg有理数相关的源码:AVRational结构体和其相关的函数分析
FFmpeg源码:av_rescale_rnd、av_rescale_q_rnd、av_rescale_q、av_add_stable函数分析
=================================================================
=================================================================
FFmpeg基本函数分析:
FFmpeg源码是由一个个基本函数组成的,了解了其基本函数,才能更好地理解FFmpeg源码:
FFmpeg源码:ff_ctz / ff_ctz_c函数分析
FFmpeg源码:av_clip、av_clip64宏定义分析
FFmpeg源码:file_read、file_write函数分析
FFmpeg源码:RELATIVE_TS_BASE宏定义和is_relative函数分析
FFmpeg源码:av_sat_add64_c、av_sat_sub64_c函数分析
=================================================================
=================================================================
FFmpeg宏定义分析:
FFmpeg源码:#define IMAGEAUTO_DEMUXER(imgname, codecid) 宏定义分析
=================================================================