ffmpeg
文章平均质量分 82
ffmpeg
hjjdebug
西方用26个字母表示世界,计算机用0,1两个数字表示世界,大道至简!
人类用6号元素碳来思考, 计算机用14号元素硅来演算,精妙绝伦!
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
ffmpeg -map 是什么意思?
摘要: FFmpeg的-map选项用于指定输出流对应的输入流映射。该选项在ffmpeg_opt.c中定义,通过opt_map函数解析参数并存储到OptionsContext对象中。例如,命令ffmpeg -i 1.ts -filter_complex "[0]split[out1][out2]" -map "[out1]" output1.ts会将[out1]映射到输出文件output1.ts,并在处理时通过OptionsContext记录流映射信息。详细日志显示,输原创 2025-12-10 17:57:02 · 361 阅读 · 0 评论 -
ff_lavfi_demuxer 介绍
本文介绍了FFmpeg中lavfi虚拟输入设备的工作原理。通过指定-f lavfi参数,输入字符串会被解析为过滤器图而非文件名。文章分析了ff_lavfi_demuxer结构体的定义,包括其包含的LavfiContext私有数据结构和相关选项(graph、graph_file、dumpgraph)。由于设置了AVFMT_NOFILE标志,输入字符串不会被当作文件处理。在lavfi_read_header函数中,命令行字符串会被解析为过滤器图。文章为理解FFmpeg中lavfi输入设备的工作机制提供了基础说明原创 2025-12-10 11:16:21 · 277 阅读 · 0 评论 -
ffmpeg 与 aac 文件解码
本文介绍了使用FFmpeg解码AAC音频文件的相关对象和流程。主要内容包括: AAC文件对应的demuxer对象ff_aac_demuxer,属于AVInputFormat类型,负责探测AAC格式、读取文件头和音频包。 AAC文件对应的parser对象ff_aac_parser,属于AVCodecParser类型,用于解析AAC音频数据帧。 介绍了如何通过FFmpeg提供的接口访问这些对象,包括av_find_input_format()查找demuxer和av_parser_init()初始化parser原创 2025-12-05 10:11:02 · 755 阅读 · 0 评论 -
标注 avcodec_send_packet 和 avcodec_receive_frame 函数
本文分析了FFmpeg 6.1中avcodec_send_packet和avcodec_receive_frame两个核心解码函数的实现原理。通过代码标注发现,avcodec_send_packet主要将外部AVPacket引用到内部buffer_pkt,并调用decode_receive_frame_internal接收帧数据到内部buffer_frame;avcodec_receive_frame则负责将内部buffer_frame移动到输出参数或再次调用接收函数。底层解码流程涉及内存分配、帧处理等操作原创 2025-12-03 10:19:26 · 913 阅读 · 0 评论 -
ffmpeg 问答系列->关于音频的思考
本文探讨了FFmpeg中音频处理的核心概念。音频帧(frame)对应AVFrame中的nb_samples变量,不同编码格式采样点数不同(如AAC为1024,MP3为1152)。原始音频(如PCM)虽不需编解码,但仍会分配AVCodecID以标识格式,其对应关系通过demuxer对象的raw_codec_id建立。测试发现,原始音频也对应decoder对象(如pcm_u8),该对象在libavcodec/pcm.c中定义。这些机制确保了FFmpeg能统一处理各类音频数据。原创 2025-12-01 18:04:44 · 1150 阅读 · 0 评论 -
ffmpeg 问答系列->demux 部分
摘要:本文探讨了FFmpeg demux模块的工作原理,重点分析了MPEG-TS流处理过程。文章详细介绍了节目数量确定(通过SDT表)、流数量统计(通过PMT表)、节目流构成关系以及编解码参数获取机制。视频流参数如pix_fmt、分辨率等通过解码过程从codec_context中获取,而codec_id和类型则由PMT表中的stream_type映射确定。整个解析过程涉及SDT、PMT表解析和数据包解码分析。原创 2025-11-21 15:46:42 · 1103 阅读 · 0 评论 -
ffmpeg 二叉树代码测试及分析
本文摘要: 文章首先介绍了二叉树的基本概念,包括结点结构、叶子结点特性以及左右子树的key值排列规则。随后讲解了平衡二叉树(AVL树)的定义,要求所有结点的左右子树高度差不超过1。 作者以3个结点的二叉树为例,分析了平衡与不平衡的情况: 平衡二叉树只有一种结构,每个结点高度差为0; 不平衡二叉树有4种结构(LL、LR、RL、RR),高度差为2,并详细说明了调整方法。 最后通过ffmpeg中的AVL树实现代码展示了具体应用: 包含AVTreeNode结构体定义 提供了插入函数av_tree_insert的实现原创 2025-11-20 09:19:11 · 754 阅读 · 0 评论 -
av_opt_set_dict 函数代码注释
本文对FFmpeg中的av_opt_set_dict函数进行了详细分析。该函数用于将AVDictionary字典中的键值对设置到指定对象中,通过调用av_opt_set_dict2实现具体功能。函数会遍历字典中的每个条目,使用av_opt_set将其应用到目标对象,处理失败时会返回错误信息。文中还涉及了相关辅助函数如字典遍历和选项查找的实现细节,并提供了多种数据类型的处理方式。该函数在FFmpeg中用于动态配置对象属性,支持包括数值、字符串、像素格式等多种选项类型。原创 2025-11-16 12:01:20 · 549 阅读 · 0 评论 -
hslenc.c 代码提纲挈领分析
本文分析了FFmpeg中HLS(HTTP Live Streaming)编码过程,重点研究了m3u8播放列表和切片文件(如test0.ts)的生成机制。通过调试跟踪,作者梳理了关键函数调用链:hls_init()和hls_write_header()完成初始化后,切片文件通过hlsenc_io_open()打开,数据经由flush_dynbuf()函数写入。该函数通过AVIOContext实现底层文件操作,最终调用系统级file_write()完成写入。文章特别指出m3u8文件是在切片文件生成后才被创建的,原创 2025-09-28 18:03:17 · 1113 阅读 · 0 评论 -
ffmpeg 问答系列-> mux 部分
本文探讨了FFmpeg中mux部分对时间戳的处理要求。分析了PTS(演播时间戳)和DTS(解码时间戳)的区别:对于MPEG音频,packet的PTS比frame的PTS小481;对于视频,DTS是严格递增的,而PTS因B帧存在会有波动。文章还解析了av_interleaved_write_frame的工作原理,包括时间戳修正、按DTS排序的缓冲机制,以及由max_interleave_delta参数控制的写入条件。通过代码示例展示了视频编码中PTS和DTS的实际变化规律。原创 2025-08-24 10:20:51 · 1036 阅读 · 0 评论 -
ffmpeg 问答系列
本文探讨了FFmpeg中流处理的相关概念,主要包括: PES流中的流ID(如0xe0视频、0xc0音频)用于标识负载内容类型,与媒体类型(音频/视频/数据流)不同。 FFmpeg通过codec->type区分流类型,codec信息包含类型和ID,如AV_CODEC_ID_MPEG2VIDEO对应AVMEDIA_TYPE_VIDEO。 流索引号反映创建顺序,通过AVFormatContext->streams[i]->index获取,写入文件时按顺序记录。 codec参数通过avcodec_原创 2025-08-23 18:15:53 · 734 阅读 · 0 评论 -
用ffmpeg 进行视频的拼接
文章摘要:本文介绍了使用FFmpeg进行视频拼接的三种方法。第一种是通过concat协议直接拼接文件(如ffmpeg -i "concat:file1|file2"),原理是concat协议按顺序读取多个文件数据。第二种是通过文件列表方式(ffmpeg -f concat -i filelist.txt),使用concat解复用器逐个读取文件数据包。两种方法都会在当前文件读取结束后自动切换到下一个文件,最终输出合并后的视频文件。文中还分析了相关源码实现,包括文件打开、数据读取和流处理等关原创 2025-07-22 17:15:10 · 1354 阅读 · 0 评论 -
全面介绍AVFilter 的添加和使用
1.两个重要的编码思想2. AVFilter 开发流程2.1 编写AVFilter 文件2.2. 向ffmpeg 系统添加AVFilter文件2.3 重新执行configure 命令2.4. 修改Makefile3.代码验证:4. 改进意见原创 2025-04-22 14:20:21 · 1387 阅读 · 0 评论 -
lavfi 深度解析
甲: 测试实例: 1.1凭空生成测试数据. 滤镜可以是数据源 1.2 动态处理数据, 如叠加,混合,调整等 1.3 视频处理常用滤镜 1.4 音频处理常用滤镜 1.5 其他实用滤镜 乙: 原理说明 1. 一个虚拟设备 ff_lavfi_demuxer, 过滤器解复用器对象 1.1 私有类对象 lavfi_class 1.2 lavfi_read_he原创 2025-04-18 10:05:33 · 1046 阅读 · 0 评论 -
ffmpeg 为什么要用avlog 来输出? 因为可以带彩色
ffmpeg 为什么要用avlog 来输出? 因为可以带彩色原创 2022-10-05 13:18:12 · 566 阅读 · 0 评论 -
avformat_find_stream_info 代码简明注释与理解
1. 前言2. 代码标注3 补充:3.1. 关于avctx->ticks_per_frame,3.2. 关于avctx->time_base 的计算, 由帧率导出.3.3. 关于 avctx->framerate 帧率的计算.原创 2025-04-02 14:13:19 · 665 阅读 · 0 评论 -
将一段二进制数据从外部copy给对象
目的.1.如何创建一个新的类,新的对象2.如何将ascii数据变成二进制数据3.如何把二进制数据copy给对象原创 2025-03-31 13:05:11 · 433 阅读 · 0 评论 -
如何理解AVBprint
1. 什么是AVBprint1.1 优点1. 它是一个数据流接受器,能够实现数据的拼接.1.2 优点2. 它自动管理内存分配,当发现内存不能容纳打印的字符串时,会重新分配内存.1.3 av_bprint_init, 初始化时指定空间的标志.1.4 av_bprint_finalize 功能2. AVBprint 调用实例3. 测试结果原创 2025-03-27 15:02:42 · 598 阅读 · 0 评论 -
怎样理解AVDictionary字典?
为什么它要这样写呢?因为核心的问题是先让计算机理解你的输入!然后把能固定的代码先固定下来, 这样后面的负担就会减小许多.原创 2025-03-26 17:34:32 · 846 阅读 · 0 评论 -
如何理解FFMPEG两个宏 1.MATCH_PER_TYPE_OPT, 2.MATCH_PER_STREAM_OPT
1.MATCH_PER_TYPE_OPT1.1 宏定义1.2 宏调用1.3 宏展开1.4 宏展开详细解释1.5 测试代码:1.6 执行结果:2. MATCH_PER_STREAM_OPT2.1 宏定义2.2 调用举例:2.3 给一个调用展开示例:2.4 展开解释:原创 2025-03-24 15:23:28 · 1102 阅读 · 0 评论 -
ffmpeg configure 研究1-命令行参数的分析
1 configure 对命令行参数的分析,在4019行1.1 函数名称: is_in1.2. 函数名称: enable1.3. 函数名称: set_all2 执行退出判断的关键代码:2.1. 函数名称: map2.2 函数名称: die_license_disabled2.3 函数名称 enabled()3. 小测试代码4.执行结果 $ ./1.sh5.小结:原创 2025-02-14 17:34:15 · 1047 阅读 · 0 评论 -
ff_set_common_formats(ctx,formats) 代码研究
第一步: 把宏展开,形成函数调用,方便调试.第二步: 构建一个合适的上下文,调用这个函数.2.1 AVFilterContext 实例的构建.2.2 AVFilterFormats 实例的构建附录: 测试环境源代码原创 2025-01-23 11:43:27 · 610 阅读 · 0 评论 -
av_buffersink_get_frame() 函数分析
av_buffersink_get_frame() 函数调用栈第10层: 调用函数第9层. 只是一个简单的包装函数,加flags为0第8层. 还是一个简单的调用,添加了一个参数(从ctx中拎出来的)最少采样数第7层,核心控制单元第6层.只有一个输入参数,就是graph,从中找到需要工作的filter第5层.只有一个输入参数filter, 功能: 确定向下的调用函数 activate第4层.只有一个输入参数,filter,判定是有数据要进filter,还是有数据要出filter原创 2024-08-09 15:00:33 · 1173 阅读 · 0 评论 -
avformat_open_input 打开URL的流程
0 in __libc_open64 of ../sysdeps/unix/sysv/linux/open64.c:37 1 in avpriv_open of libavutil/file_open.c:84 2 in file_open of libavformat/file.c:231 3 in ffurl_connect of libavformat/avio.c:213 4 in ffurl_open_whitelist of libavformat/avio.c:347原创 2024-08-14 13:29:09 · 862 阅读 · 0 评论 -
分析 avformat_open_input 数据读取过程
avformat_open_input 中读取数据.0 in read of libc 中的 read 函数入口.1 in file_read of libavformat/file.c:1142 in retry_transfer_wrapper of libavformat/avio.c:3703 in ffurl_read of libavformat/avio.c:4054 in read_packet_wrapper of libavformat/aviobuf.c:521原创 2024-08-13 17:39:15 · 878 阅读 · 0 评论 -
av_buffersrc_add_frame_flags() 函数分析
av_buffersrc_add_frame_flags(buffersrc_ctx, frame, AV_BUFFERSRC_FLAG_KEEP_REF)这个函数是比较简单的,就是把frame拷贝后(引用加1)av_frame_ref()添加到buffersrc_ctx 的FrameQueue上就完事了. ff_filter_frame()原创 2024-08-09 14:32:32 · 652 阅读 · 9 评论 -
avfilter 代码分析2(avfilter_graph_parse_ptr)
着重分析一个函数: avfilter_graph_parse_ptr()原创 2024-08-08 15:53:09 · 1067 阅读 · 0 评论 -
avfilter 使用与代码分析1
1. 根据文件名称打开输入文件. 2. 根据过滤器字符串初始化过滤器3. 使用过滤器4. graph内存分配: avfilter_graph_alloc5. 由名称查找filter avfilter_get_by_name6. 在图上创建filter_context原创 2024-08-07 17:48:07 · 1079 阅读 · 0 评论 -
ffmpeg 解包流程
第0层 alloc_picture 第1层 h264_frame_start 第2层 h264_field_start第3层 ff_h264_queue_decode_slice (pause)第4层 decode_nal_unit 第5层 h264_decode_frame 第6层 decode_simple_internal 第7层 decode_simple_receive_frame 第8层 decode_receive_frame_internal第9层 avcodec_send原创 2024-08-06 15:13:43 · 1533 阅读 · 0 评论 -
ffmpeg 的内存分配架构
第0层: av_malloc第1层: av_mallocz第2层: av_buffer_create第3层 av_buffer_alloc第4层: av_buffer_allocz第5层: pool_alloc_buffer第6层: av_buffer_pool_get第7层: video_get_buffer第8层: avcodec_default_get_buffer2第9层 ff_get_buffer原创 2024-08-01 18:01:50 · 1532 阅读 · 0 评论 -
av_parse_pars2() 代码内存使用分析
1. 前边n次读取的数据都存放到哪了, 它们什么时候释放内存呢?2. 当发现可以组装成一个包时,发生了什么?3. parser 申请的内存啥时候释放.原创 2024-07-30 14:06:10 · 1041 阅读 · 0 评论 -
av_packet_unref()代码分析
甲: 释放包的附加数据乙: 解引用AVBuffervoid av_freep(void *arg) 即释放内存,又由函数把指针赋值为空是如何实现的, 传递指针地址即可!原创 2024-07-25 15:15:55 · 625 阅读 · 0 评论 -
av_read_frame 代码研究
0 in mpegts_push_data of libavformat/mpegts.c:13771 in handle_packet of libavformat/mpegts.c:28462 in handle_packets of libavformat/mpegts.c:29753 in mpegts_read_packet of libavformat/mpegts.c:32194 in ff_read_packet of libavformat/utils.c:843原创 2024-07-05 11:10:49 · 930 阅读 · 0 评论 -
avformat_open_input 代码再分析
我理解了如下问题,就把它作为大纲目录了.1. 在哪里和怎样查找到协议的? 是通过文件名称(url)找到协议的.2. 在哪里和怎样查找到demuxer的?3. 在哪里和怎样读取数据的?4. 是怎样分析数据的?5. 数据指针怎样rewind?6. 实现部分怎样读取文件头?原创 2024-07-03 17:56:18 · 842 阅读 · 0 评论 -
ffmpeg 从avio_read 到 file_read
第一层: aviobuf.c中, AVIOContext对象当家, 这就是pReadCtx.第二层: avio.c中, URLContext 当家, 简记为h.第三层: file.c中, FileContext 对象当家,简记为c.原创 2024-03-13 15:52:49 · 1258 阅读 · 0 评论 -
ffmpeg 从avio_write 到 udp_write
1. main 调用avio_write2. avio_write 调用flush_buffer3. flush_buffer 调用的writeout函数4. writeout 函数调用了ffurl_write 函数, 5. ffurl_write 直接调用了retry_transfer_wrapper6. udp_write 函数参数, 有一个内存handle, 数据指针和大小, 是实际传递数据的地方.原创 2024-03-11 14:20:59 · 1232 阅读 · 0 评论 -
ff_compute_frame_duration() 代码注释
* 输入参数: s(格式上下文), st(流), pc(分析器上下文), pkt(包) * 输出参数: pnum(分子地址),pden(分母地址) * 描述: 返回 frame 时长,秒值,用分数表达. 得不到时长时返回 0(*pnum=0,*pden=0);原创 2023-10-26 15:15:08 · 249 阅读 · 0 评论 -
avformat_find_stream_info 为什么总是等到超时或超过大小才退出?
avformat_find_stream_info 为什么不能正常退出了?对于 ts 流文件,如果你设置了scan_all_pmts 选项, 则主动退出条件将不会满足,因为它的ctx_flags一直是1而不能清0. 所以find_stream_info 不会主动退出. 只能等超时或超过指定大小才退出了。原创 2023-09-21 11:11:36 · 613 阅读 · 0 评论 -
从c++的角度来看ffmpeg 的架构
1. AVClass 类就是一个普通的类. 基本的类.2. ffmpeg 中包含了很多context类, 它们共同继承于baseContext类.3. ffmpeg 中有很多对象: 这些对象都是常对象,存在于全局变量中原创 2023-08-01 11:35:20 · 864 阅读 · 0 评论 -
ffmpeg 中 av_log 是怎样工作的?
av_log 功能其实只是添加了颜色,LOG级别,及log上下文名称,没有添加时间,函数名称,行号等信息.原创 2023-07-27 15:05:32 · 816 阅读 · 0 评论
分享