[FFMPEG]代码分析:ffmpeg.c

news/2024/7/10 20:33:24 标签: 代码分析, ffmpeg-c, ffmpeg

1.前沿

接触ffmpeg2年多,系统使用大概半年左右。ffmpeg命令行方式作为“本地文件”处理足够,但要更加精准的控制还是需要借用SDK的方式,好在ffmpeg的example中提供了大量的简单例子。好了废话不多说,开始干活。
ffmpeg版本3.2

2.主体结构分析

简单记录讲解比较重要的函数

main:主函数入口
  |--*_register_all:注册各种模块(ffmpeg驱动模块化思维的最佳体现);
  |--avformat_network_init:初始化网络环境
  |--ffmpeg_parse_options:<1>解析并设置命令行的输入参数;<2>打开输入输出“文件”;<3>初始化complex filters;
  |--transcode:转码/流重封装入口
    |--transcode_init:初始化输入输出的codec;
      |--init_input_stream
        |--avcodec_open2:打开解码器
      |--init_output_stream
        |--1.0.编码
        |--1.1.init_output_stream_encode:设置编码参数的函数,该函数具有很强的参考意义
        |--1.2.avcodec_open2:打开编码器
        |--1.3.avcodec_parameters_from_context
        |--1.4.avcodec_copy_context
        |--2.0.重封装
        |--2.1.init_output_stream_streamcopy:重封装函数
        |--2.2.avcodec_parameters_to_context
        |--init_output_bsfs:初始化bsfs(bsfs相关函数接口有新的变化,可以参考更新
    |--transcode_step
      |--configure_filtergraph:初始化simple filters,包括构建graph
      |--transcode_from_filter:
        |--avfilter_graph_request_oldest
        |--reap_filters(0)
          |--av_buffersink_get_frame_flags        (AV_BUFFERSINK_FLAG_NO_REQUEST)
          |--do_video_out
      |--process_input:转码重要步骤
        |--get_input_packet:获取解码帧数据
          |--av_read_frame:读取一帧数据
          |--process_input_packet
            |--decode_video
              |--decode:(avcodec_send_packet/avcodec_receive_frame):解码关键函数,新的接口
              |--av_frame_get_best_effort_timestamp
              |--send_frame_to_filters:将解码帧送往graph入口
                |--ifilter_send_frame
                  |--reap_filters(1)
                  |--av_buffersrc_add_frame_flags  (AV_BUFFERSRC_FLAG_PUSH)
      |--reap_filters(0):获取帧并封装输出

HAVE_PTHREADS:将为对读输入流单独创建线程,读取的帧数据放入队列;当解码需要数据时,再从队列中取出数据;

3.reap_filters分析

reap_filters
  |--av_buffersink_get_frame_flags (AV_BUFFERSINK_FLAG_NO_REQUEST):从graph输出口获取filter数据
  |--do_video_out
    |--编码:(avcodec_send_frame/avcodec_receive_packet) :编码帧
    |--av_packet_rescale_ts(&pkt, enc->time_base, ost->mux_timebase);
    |--output_packet
      |--bitstream filters:(av_bsf_send_packet/av_bsf_receive_packet):bsfs处理
      |--write_packet:封装发送
        |--av_packet_rescale_ts(pkt, ost->mux_timebase, ost->st->time_base);
        |--av_interleaved_write_frame(s, pkt);

ffmpeg_63">4.关于ffmpeg例子的一些坑

1.编码后的fps和tbc,总是源的两倍?
2.输出为mpegts时,且设置muxrate,阻塞?
3.当流出现丢包时,会卡住?
4.多线程使用,出现段错误?
5.当不使用muxrate时,pat/pmt/pcr间隔严重失准?
6.如何偏移pts和dts?


http://www.niftyadmin.cn/n/1336039.html

相关文章

下拉组合框控件演示

下拉组合框控件演示&#xff1a; 关键代码&#xff1a; combobox{cls"combobox";left19;top58;right446;bottom84;edge1;items{};mode"dropdown";z5};//下拉组合框列表的选项集合 winform.combobox.items {选项1;选项2;选项3;选项4;选项5 } 完整代码&#…

ubuntu查看支持的字体库

##1.背景 sugaomsos:~/mscore/src$ uname -a Linux msos 4.4.0-75-generic #96-Ubuntu SMP Thu Apr 20 09:56:33 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux##2.命令 fc-list 查看所有的字体 fc-list :langzh 查看所有的中文字体 ##3.增加字体 默认字体文件放在/usr/share/fon…

重构与重写

在内部看到的评论&#xff0c; 觉得很有道理&#xff0c;记录下&#xff1a; 重构(名词)&#xff1a;对软件内部结构的一种调整&#xff0c;目的是在不改变软件可观察行为的前提下&#xff0c;提高其可理解下&#xff0c;降低其修改成本。 重构(动词)&#xff1a;使用一系列重构…

都8210年了,还不知道docker就过分了

软件开发最大的麻烦事之一&#xff0c;就是环境配置。特别是万恶的windows,经常出现一些奇怪的问题。 特别是新人入职&#xff0c;要装一大堆环境&#xff0c;就比如我们团队&#xff0c;后端是Go&#xff0c;要装啥环境我不太清楚。前端的话&#xff0c;需要装php,redis,node,…

[PPPOE]RP-PPPOE脚本分析

默认配置 配置存放目录:/etc/ppp/pppoe.conf ppp-pap密码存放目录:/etc/ppp/pap-secrets ppp-chap密码存放目录:/etc/ppp/chap-secrets PPP防火墙&#xff1a;/etc/ppp/firewall-standalone和/etc/ppp/firewall-masq ppp网卡:文件/var/run/ppp0.pid 1.配置文件 配置文件&…

[PPPOE]RP-PPPOE源码分析

##1.基本 pppoe-connect中实际调用的pppoe命令为&#xff1a; /usr/sbin/pppoe -p /var/run/pppoe_eth1.pid.pppoe -I eth1 -T 80 -U -m 1412编译依赖文件包括&#xff1a;pppoe.c if.c debug.c common.c ppp.c discovery.c ##2.选项 -I if_name 指定拨号网卡&#xff0c;默认…

Windows Server 2012 R无法安装.NET Framework 3.5

Windows Server 2012 R2或2016无法安装.NET Framework 3.5&#xff0c;安装时报错&#xff0c;找不到源文件。百度了下全是黏贴复制使用shell脚本的安装方法&#xff08;https://help.aliyun.com/knowledge_detail/38203.html &#xff09;&#xff0c;但是使用shell安装同样也…

[PPPOE]PPPD分析

##1.基本 /usr/bin/setsid /usr/sbin/pppd pty ‘/usr/sbin/pppoe -p /var/run/pppoe_eth1.pid.pppoe -D /var/run/pppoe_eth1.pid.pppoe.log -I eth1 -T 80 -U -m 1412’ noipdefault noauth default-asyncmap defaultroute hide-password nodetach usepeerdns mtu 1492 mru 1…