ffmpeg中关于ffplay部分的概要分析-1

ffplay是ffmpeg中的一个播放音视频流的功能,现简要对其进行分析:

1. 图1是ffplay的主干代码流程

1)在stream_open函数之前,主要是对入参的一些分析,所有codec,demux以及相关protocool的注册

  注册两个信号量:一个是给中断使用,一个是给终端操作使用(比如键盘,鼠标等的一些动作)

2)在stream_open函数中,先是对video,audio,subtitle三个format的消息队列进行初始化,

  再对收发数据的队列进行初始化。然后调用SDL_CreateThread函数开启 read_thread()线程。

3)在创建完线程后,进入event_loop函数中,开始等待来自终端设备的事件,比如,鼠标,键盘的一些操作,以及推出等命令,

  具体哪些事件可以详见代码中的switch中每个case的分之。

4)在event_loop函数中,会通过refresh_loop_wait_event()函数等待来自外部一些事件,然后对相应的事件进行响应。

5)其实event_loop就是ffplay的一个线程,它并没有退出,而是一直在这里loop。

2. 图2是read_thread线程的主要流程:

1) 通过调用avformat_open_input()函数来确认要用哪种demux来处理到来的data stream,主要就是读取一段数据流,

对该流进行分析看它与哪种demux最为匹配,具体怎么做没有细看。

2) avformat_find_stream_info()函数根据最前端的一段数据流来分析该流是 视频,音频或字幕,若是音频或者视频是哪种

  格式的,是编码还是解码(这个根据输入输出的格式来确认),同时找到对应的编码器或者解码器。不是很清楚为什么需要

  在这里调用函数try_decode_frame()对新来的数据流进行解码。

3) av_find_best_stream()函数是找到对应的编码器或解码器。

4) 函数stream_component_open()主要分别打开audio, video, subtitle这三个模式的各自的线程

  audio_thread, video_thread, subtitle_thread。

5) 线程read_thread()在完成上述任务后,开始循环处理来自外界的一些信息:

a) abort 退出请求

  b) pause 暂停请求

  c) seek 跳转请求 (视频的前进后退等的请求)

  d) 判断如何缓冲buffer满了,休息等待10ms后再准备向各个模式的缓冲buffer中放数据

  e) 调用av_read_frame() 获取data packet后,再通过调用packet_queue_put()函数将数据放倒对应的缓冲buffer中。

    调用packet_queue_put函数放置packet,没有经过copy而是直接将packet的指针赋给对应模式的缓冲链表中的队尾,

    这样减少了copy,节省了时间。

第一天开始看ffplay的代码,现在已经离开音频这个行业了,但是还是对这个行业非常感兴趣。

为了不失去自己的技术敏感度,只能自己业余时间来读读代码,锻炼锻炼脑袋了。

很感谢网上哪些技术大牛的博客以及文章,迅速的在自己的mac上搭建好了eclipse的环境以及

ffmpeg编译顺利通过。

时间: 2024-10-13 18:38:43

ffmpeg中关于ffplay部分的概要分析-1的相关文章

ffmpeg中关于ffplay部分的概要分析-2

全局变量options[] 包含了所支持的所有的命令行选项,可以用来确认所输入的变量是否能对应到options[]中,若解析正确则将得到的值赋予给options[]中所提前指定的变量中,比如video_disable和audio_disable的值就来自于命令行.函数parse_options()会对命令行中输入的参数进行解析,解析的依据就是全局变量 options[]. 函数SDL_Init(flags),其中flags=SDL_INIT_VIDEO | SDL_INIT_AUDIO | SD

ffmpeg中关于ffplay部分的概要分析-3

/////////////////////////////////////////////////////// 函数av_probe_input_buffer2()是在函数s->io_open()之后被调用. 其工作流程是:首先会通过函数avio_read()读取文件中的数据,然后调用函数av_probe_input_format2()对已读取的数据进行分析, 主要分析的是文件内的格式,并根据相似度给出相应的评分score. 其调用栈如下: av_probe_input_buffer2() av

(转)ffmpeg 中 av_read_frame_internal分析

作者: chenwei1983    时间: 2012-3-5 04:21 PM标题: ffmpeg 中 av_read_frame_internal分析                            原出处:http://www.chinavideo.org/viewthread.php?action=printable&tid=13846av_read_frame_internal 在ffmpeg中实现了将format格式的packet,最终转换成一帧帧的es流packet,并解析填

ffmpeg中av_log的实现分析

[时间:2017-10] [状态:Open] [关键词:ffmpeg,avutil,av_log, 日志输出] 0 引言 FFmpeg的libavutil中的日志输出的接口整体比较少,但是功能还是不错的,对于后续自己实现日志模块还是值得参考的.本文就libavutil中的日志模块部分的实现做一个简要的整理.希望可以达到解释清楚的目的. 注意:本部分的主要代码位于libavtuil/log.h.libavutil/log.c. 1 AVClass的定义部分 log接口的输出是依赖于AVClass的

ffmpeg中AVBuffer的实现分析

[时间:2017-10] [状态:Open] [关键词:ffmpeg,avutil,avbuffer, 引用计数] 0 引言 AVBuffer是ffmpeg提供的基于引用计数的智能指针的一个实现版本. FFmpeg中很多结构体是基于AVBuffer实现的,比如AVFrame.AVPacket. AVBuffer实现 主要实现文件位于libavutil中的buffer.h.buffer_internal.h.buffer.c三个文件中.其中最主要的是两个结构体AVBufferRef和AVBuffe

零基础读懂视频播放器控制原理: ffplay 播放器源代码分析

https://www.qcloud.com/community/article/535574001486630869 视频播放器原理其实大抵相同,都是对音视频帧序列的控制.只是一些播放器在音视频同步上可能做了更为复杂的帧预测技术,来保证音频和视频有更好的同步性. ffplay 是 FFMpeg 自带的播放器,使用了 ffmpeg 解码库和用于视频渲染显示的 sdl 库,也是业界播放器最初参考的设计标准.本文对 ffplay 源码进行分析,试图用更基础而系统的方法,来尝试解开播放器的音视频同步,

FFmpeg的H.264解码器源代码简单分析:概述

本文简单记录FFmpeg中libavcodec的H.264解码器(H.264 Decoder)的源代码.这个H.264解码器十分重要,可以说FFmpeg项目今天可以几乎"垄断"视音频编解码技术,很大一部分贡献就来自于这个H.264解码器.这个H.264解码器一方面功能强大,性能稳定:另一方面源代码也比较复杂,难以深入研究.本文打算梳理一下这个H.264解码器的源代码结构,以方便以后深入学习H.264使用.PS:这部分代码挺复杂的,还有不少地方还比较模糊,还需要慢慢学习...... 函数

FFmpeg的H.264解码器源代码简单分析:解析器(Parser)部分

本文继续分析FFmpeg中libavcodec的H.264解码器(H.264 Decoder).上篇文章概述了FFmpeg中H.264解码器的结构:从这篇文章开始,具体研究H.264解码器的源代码.本文分析H.264解码器中解析器(Parser)部分的源代码.这部分的代码用于分割H.264的NALU,并且解析SPS.PPS.SEI等信息.解析H.264码流(对应AVCodecParser结构体中的函数)和解码H.264码流(对应AVCodec结构体中的函数)的时候都会调用该部分的代码完成相应的功

FFmpeg的H.264解码器源代码简单分析:宏块解码(Decode)部分-帧内宏块(Intra)

本文分析FFmpeg的H.264解码器的宏块解码(Decode)部分的源代码.FFmpeg的H.264解码器调用decode_slice()函数完成了解码工作.这些解码工作可以大体上分为3个步骤:熵解码,宏块解码以及环路滤波.本文分析这3个步骤中的第2个步骤.由于宏块解码部分的内容比较多,因此将本部分内容拆分成两篇文章:一篇文章记录帧内预测宏块(Intra)的宏块解码,另一篇文章记录帧间预测宏块(Inter)的宏块解码. 函数调用关系图 宏块解码(Decode)部分的源代码在整个H.264解码器