ffplay深入解析——main函数解析篇(二)

介绍:

我是李铁山,ffplay是基于ffmpeg的播放器,B站大名鼎鼎的ijkplayer也是基于此二次开发,因此很有学习价值。

这篇文章是我深入解析ffplay的首篇,将会从main函数,自顶向下地剖析源码。

如果您对于源码感兴趣,可以查看ffplay的github地址https://github.com/FFmpeg/FFmpeg/blob/master/fftools/ffplay.c

一:处理音视频文件流程

那么我们接下来开始。ffplay.c的main函数也就100行代码,之后几篇我会深入解析其中用到的函数。

上次我们解析完用户输入的命令,现在就开始正式处理音视频文件了。

上图就是我们解析一个视频文件的流程。比如我们输入了一个mp4的视频文件给 ffplayer,然后由解复用器,相当于解格式,将 mp4 文件解开封装,取出内部的 packet 文件。

取出 packet 文件后放入相应的队列当中,音频 packet 放入音频队列,视频 packet 放入视频队列然后等待相应的解码器处理。

接着开始解码,将 packet 中的frame(帧)解析出来,放到 frame 的队列中。

最后,由音视频渲染器,SDL,OpenGL等根据音频帧,视频帧队列里面的数据做出屏幕画面,声音的渲染。这过程当中当然要做音频和视频的同步管理,不然音画不同步得被观众骂~

OK,大致的流程我们了解之后,接着就可以继续解读 ffplay 的源码啦!

二:解读源码

#if CONFIG_AVDEVICE
    avdevice_register_all();
#endif
    avformat_network_init();

    signal(SIGINT , sigterm_handler); /* Interrupt (ANSI).    */
    signal(SIGTERM, sigterm_handler); /* Termination (ANSI).  */

    show_banner(argc, argv, options);

我们可以看到在首先有五个函数映入眼帘。

avdevice_register_all 和 avformat_network_init 这两个函数是做网络库和输入、输出设备的初始化,这也不是我们的重点,知道有要有这个功能就行。

然后是两个 signal 函数,是处理信号的一种方法,大致意思是操作系统收到 SIGINT(通常是由于用户按下 Ctrl+C 组合键产生的) 或者 SIGTERM(通常由系统或管理员发送,用于请求程序终止) 的信号,调用 sigterm_handler 函数来处理,处理结果是 exit(123),结束程序并返回状态码123,看下面 sigterm_handler 的代码。

static void sigterm_handler(int sig)
{
    exit(123);
}

下一个函数 show_banner 也没必要深究,就是打印一些视频文件的信息到终端。

好的,那么前五个函数我们都大致过一遍,基本就是做一些初始化,中断信息的处理和打印信息,最后今天我们再看接下来几行。

  ret = parse_options(NULL, argc, argv, options, opt_input_file);
  if (ret < 0){
      exit(ret == AVERROR_EXIT ? 0 : 1);
  }
  if (!input_filename) {
      show_usage();
      av_log(NULL, AV_LOG_FATAL, "An input file must be specified\n");
      av_log(NULL, AV_LOG_FATAL,
             "Use -h to get full help or, even better, run 'man %s'\n", program_name);
      exit(1);
  }

  if (display_disable) {
      video_disable = 1;
  }

大体上看都是一些判断是否继续解析视频的功能。

parse_options 是解析命令行参数的,大家知道有这个功能就行,不用深究其中的奥秘,比较复杂而且与主题关系不大。当然,解析失败后就终止程序。

然后就判断有没有 input_filename,这很好理解,程序都没有要解析视频文件的名字,当然报错了。

最后这个条件判断,我估计是如果 display_disable 表示不能播放的标志位,如果为 true 的话将 video_disbale 也设置为 true,表示将来不能播放视频。

好了,今天就讲这么多,基本就是一些解析音视频的前期工作,包括初始化,解析输入参数,能否播放视频的前期判断。

欲知后事如何,请听下回分解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值