![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
FFplay源码分析
文章平均质量分 80
这个系列主要目的是让读者看完这个系列之后能对 ffplay.c 的主干逻辑有清晰的了解。一些次要的功能,例如各种 ffplay 命令行中其他的命令参数 -filter -vcodec 等等。理解主干逻辑之后,自行断点debug即可了解 -filter -vcodec 等
Loken2020
音视频工程师,《FFmpeg原理》作者
展开
-
FFplay源码分析-RTMP的PTS
本系列 以 ffmpeg4.4 源码为准,主要讲解 ffplay 的 RTMP 协议解析,播放。本文使用的命令如下:ffplay -loglevel quiet -fflags nobuffer -i rtmp://192.168.0.122/live/livestream播放音视频流最重要的是同步,同步需要用到各个帧的pts,下面就来分析一下ffplay从 RTMP 地面读取到的帧的 pts 是从哪个字段提取出来的。前面几篇文章《FFplay源码分析-rtmp入口》《FFplay源码分析..原创 2022-04-11 19:44:49 · 523 阅读 · 0 评论 -
FFplay源码分析-日志
本文的环境是局域网RTMP直播,SRS部署在另一台电脑,播放是另一台电脑。ffplay 播放命令如下:.\ffplay -fflags nobuffer -x 800 -f flv -i rtmp://192.168.0.123/live/test本文主要是讲解如何查询 ffplay 的 打印出来的日志。如下图:日志的代码如下:结合代码分析,上图中的 8.11 是音频播放的时间,也就是音频已经播放了 8.11 秒,然后 A-V 就是音视频时钟差值,这个 值会不断维持在一个比较小原创 2022-04-11 19:43:36 · 730 阅读 · 0 评论 -
FFplay源码分析-nobuffer
本系列 以 ffmpeg4.4 源码为准,主要讲解 ffplay 的 RTMP 协议解析,播放。本文使用的命令如下:ffplay -fflags nobuffer -i rtmp://192.168.0.122/live/livestream在使用 FFplay 播放 RTMP 流的时候,如果 不开启nobuffer选项,画面延迟会高达 7 秒左右,开启了,局域网延迟可降低到100毫秒左右。因此本文主要研究nobuffer的具体实现,以及播放端 缓存 7 秒的数据有何作用。ff...原创 2022-03-29 13:57:10 · 2522 阅读 · 0 评论 -
FFplay源码分析-avformat_open_input
本系列 以 ffmpeg4.4 源码为准,主要讲解 ffplay 的 RTMP 协议解析,播放。本文使用的命令如下:ffplay -i rtmp://192.168.0.122/live/livestream前两篇文章 《FFplay源码分析-rtmp入口》 《FFplay源码分析-rtmp_open》 其实已经讲解了avformat_open_input()函数内部的一部分的逻辑,就是已经知道 RTMP 链接建立,然后读取到第一个 音视频包的逻辑。但是还有一部分逻辑没讲,就是探测av_pr...原创 2022-03-29 13:53:50 · 3041 阅读 · 0 评论 -
FFplay源码分析-rtmp_open
本系列 以 ffmpeg4.4 源码为准,主要讲解 ffplay 的 RTMP 协议解析,播放。本文使用的命令如下:ffplay -i rtmp://192.168.0.122/live/livestream本文主要讲解rtmp_open()函数的实现,RTMP 协议的代码都在libavformat/rtmpproto.c文件里面,请看下面截图:RTMP 经常使用的函数,rtmp_open(建立链接),rtmp_read(读取数据),rtmp_write,rtmp_seek...原创 2022-03-29 13:53:10 · 1070 阅读 · 1 评论 -
FFplay源码分析-rtmp入口
本系列 以 ffmpeg4.4 源码为准。本文主要讲解 ffplay 的 RTMP 协议解析,播放。本文使用的命令如下:ffplay -i rtmp://192.168.0.122/live/livestream先按照之前的博客的教程 配置好 window 10 qt creator + msvc 的调试环境。必须是 msvc ,mingw不行,mingw无法debug 进去 ffmpeg的动态库。本博客暂时没有具体的教程讲解如何 移植 ffplay.c 到 qt msvc 环境,具体可以参考《F原创 2022-03-29 13:51:45 · 843 阅读 · 0 评论 -
FFplay硬件加速
本文 以 ffmpeg-4.4 源码为准,a.mp4下载链接:百度网盘,提取码:nl0s 。FFplay 硬件解码命令如下:ffplay.exe -vcodec h264_cuvid -i a.mp4上面命令指定了 NVIDIA 的 硬件解码器,h264_cuvid。 在 ffplay.c 的代码里面 硬件解码 跟 普通解码在逻辑上没有做什么特殊的处理。ffplay.c里面没有像ffmpeg.c那样支持-hwaccel这个选项,所以 ffplay.c 的硬件解码流程 跟 普通解码...原创 2022-03-29 13:50:58 · 2230 阅读 · 0 评论 -
FFplay命令分析-vf
本系列 以 ffmpeg4.2 源码为准,下载地址:链接:百度网盘提取码:g3k8本系列主要分析各种 ffplay 命令参数 在代码里是如何实现的。a.mp4下载链接:百度网盘,提取码:nl0s 。命令如下:ffplay-window_title"Test Movie"-vf"subtitles=a.srt"a.mp这是一条使用 video 滤镜的命令,把字幕嵌入到视频帧里面。在ffplay 的实现里面非常简单,如下图:1,"subtitles=a.srt" 这个命令...原创 2022-03-29 13:48:59 · 2509 阅读 · 0 评论 -
FFmpeg,Fplay,clion调试环境搭建
本系列 以 ffmpeg4.4 源码为准。本文主要讲解如何搭建 ffplay 的CLion调试环境。 ffmpeg 在 Linux 环境下更好调试。本文系统是 Ubuntu 18,首先下载 FFmpeg-n4.4.1.zip ,虽然 FFmpeg 是通过 makefile 编译的,但是还是可以用Clion来调试,比 gdb 更直观一些。CLion 目前的最新版本比较完善,早几年我用的时候,调试好像必须提供 CMakeList 文件,现在只有 makefile 文件也能用 Clion 调试了。操作..原创 2022-03-15 15:31:58 · 1980 阅读 · 0 评论 -
FFplay源码分析-总结
本系列 以 ffmpeg4.2 源码为准,下载地址:链接:百度网盘 提取码:g3k8FFplay 源码分析系列以一条简单的命令开始,ffplay -i a.mp4。a.mp4下载链接:百度网盘,提取码:nl0s 。FFplay 已经分析完毕,是时候画一幅整体的函数流程图了。再画一幅整体的数据结构图。ffplay 源码分析,分析完毕,666。©版权所属:知识星球:弦外之音,QQ:2338195090。由于笔者的水平有限, 加之编写的同时还要参与开发工作,文中难免会出现一些错误或者不准确原创 2022-02-11 09:39:21 · 247 阅读 · 0 评论 -
FFplay源码分析-退出处理
本系列 以 ffmpeg4.2 源码为准,下载地址:链接:百度网盘 提取码:g3k8FFplay 源码分析系列以一条简单的命令开始,ffplay -i a.mp4。a.mp4下载链接:百度网盘,提取码:nl0s 。FFplay 退出处理分析,按键盘 Q 可以退出关闭播放器。按下键盘 Q 的时候,会产生一个 SDK_q 事件,此事件在event_loop处理,执行 do_exit() 操作,如下图:do_exit() 的流程图如下:ffplay 有两个 abort_request ,str原创 2022-02-11 09:38:11 · 2300 阅读 · 0 评论 -
FFplay源码分析-EOF
本系列 以 ffmpeg4.2 源码为准,下载地址:链接:百度网盘 提取码:g3k8FFplay 源码分析系列以一条简单的命令开始,ffplay -i a.mp4。a.mp4下载链接:百度网盘,提取码:nl0s 。FFplay 最后一篇文章了,本文章主要讲解,文件播放结束之后的情况,各线程处于一种什么样的状态。read_thread 数据读取线程:数据读取线程 里面 av_read_frame() 返回 ret 等于 -1,设置 is->eof 为 1,休眠10ms,然后继续尝试av_re原创 2022-02-11 09:35:32 · 2455 阅读 · 0 评论 -
FFplay源码分析-pause
本系列 以 ffmpeg4.2 源码为准,下载地址:链接:百度网盘 提取码:g3k8FFplay 源码分析系列以一条简单的命令开始,ffplay -i a.mp4。a.mp4下载链接:百度网盘,提取码:nl0s 。ffplay 的大部分主要逻辑已经讲完了,本文主要讲解 ffpaly 暂停跟开始播放是如何实现的,还有在暂停状态下,各个线程在干什么。首先分析 read_thread() 线程。知道,read_thread() 线程 主要做的事情是读文件,读出packet,然后插入 PacketQue原创 2022-02-11 09:31:45 · 443 阅读 · 0 评论 -
FFplay源码分析-音视频同步3
本系列 以 ffmpeg4.2 源码为准,下载地址:链接:百度网盘 提取码:g3k8FFplay 源码分析系列以一条简单的命令开始,ffplay -i a.mp4。a.mp4下载链接:百度网盘,提取码:nl0s 。上一篇文章已经讲完了视频播放线程的内部逻辑,视频同步算法也进行了讲解。本文开始讲音频同步算法,也就是用**-sync video** 把同步方式 设置为 AV_SYNC_VIDEO_MASTER。因为视频是主时钟,所以video_reflesh() 播放视频的时候,compute_ta原创 2022-02-11 09:30:41 · 625 阅读 · 0 评论 -
FFplay源码分析-音视频同步2
本系列 以 ffmpeg4.2 源码为准,下载地址:链接:百度网盘 提取码:g3k8FFplay 源码分析系列以一条简单的命令开始,ffplay -i a.mp4。a.mp4下载链接:百度网盘,提取码:nl0s 。上一篇文章已经讲解完 音频播放线程函数 sdl_audio_callback() 内部逻辑,本篇文章开始讲解 视频播放线程的内部逻辑。音视频同步方式是 AV_SYNC_AUDIO_MASTER,以音频为主时钟,本文基于这种同步方式做讲解。视频播放线程,实际上就是就是 main() -原创 2022-02-11 09:28:29 · 1187 阅读 · 0 评论 -
FFplay源码分析-音视频同步1
本系列 以 ffmpeg4.2 源码为准,下载地址:链接:百度网盘 提取码:g3k8FFplay 源码分析系列以一条简单的命令开始,ffplay -i a.mp4。a.mp4下载链接:百度网盘,提取码:nl0s 。之前的文章已经讲解完 3 个线程的内部逻辑。read_thread(),packet 读取线程,不断往 PacketQueue 写数据,直至队列写满。audio_thread(),音频解码线程,从 音频PacketQueue 拿数据,解码出Frame,不断往 FrameQueue写数原创 2022-02-11 09:26:46 · 1335 阅读 · 0 评论 -
FFplay源码分析-video_thread
本系列 以 ffmpeg4.2 源码为准,下载地址:链接:百度网盘 提取码:g3k8FFplay 源码分析系列以一条简单的命令开始,ffplay -i a.mp4。a.mp4下载链接:百度网盘,提取码:nl0s 。上一篇文章已经讲解完了 audio_thread() 音频解码线程的逻辑,这篇文章主要讲解 video_thread(),视频解码线程的内部逻辑。知识点:audio_thread 音频解码线程获取 frame 用的是 decoder_decode_frame() 函数。而 vide原创 2022-02-11 09:24:13 · 2870 阅读 · 0 评论 -
FFplay源码分析-调试环境搭建
第一篇文章先讲解如何搭建 window 10 qt creator 环境,用来断点调试 ffplay.c 的代码。请先阅读之前的文章,搭建好预备环境,因为 ffplay.c 的移植跟 ffmpeg.c 类似,所以直接在 《ffmpeg.c 工程移植》基础上讲解。Qt 安装教程FFmpeg MSYS2环境编译教程ffmpeg.c 工程移植假设你已经看完以上3篇文章了。移植开始:1,打开Qt creator,点击New File Or Project,选择 Non-Qt Project ,选择原创 2022-01-23 00:32:48 · 3453 阅读 · 0 评论 -
FFplay源码分析-main
本系列 以 ffmpeg4.2 源码为准,下载地址:链接:百度网盘 提取码:g3k8FFplay 源码分析系列以一条简单的命令开始,ffplay -i a.mp4。a.mp4下载链接:百度网盘,提取码:nl0s 。这个系列主要目的是让读者看完这个系列之后能对 ffplay.c 的主干逻辑有清晰的了解。一些次要的功能,例如各种 ffplay 命令行中其他的命令参数**-filter** -vcodec等等。理解主干逻辑之后,自行断点debug即可了解 -filter -vcodec 等 命令参数实现。原创 2022-01-23 00:34:51 · 1010 阅读 · 0 评论 -
FFplay源码分析-main2
本系列 以 ffmpeg4.2 源码为准,下载地址:链接:百度网盘 提取码:g3k8FFplay 源码分析系列以一条简单的命令开始,ffplay -i a.mp4。a.mp4下载链接:百度网盘,提取码:nl0s 。在 main() 里面调用 parse_options() 解析完命令行参数之后,后面还有4个逻辑需要注意。如下图:重点已经用红笔画出来了。1,flush_pkt 变量初始化,flush_pkt 是一个 AVPacket,它的data不是NULL,所以 flush_pkt 不是用来刷原创 2022-01-23 00:39:49 · 1644 阅读 · 0 评论 -
FFplay源码分析-streams_open
本系列 以 ffmpeg4.2 源码为准,下载地址:链接:百度网盘 提取码:g3k8FFplay 源码分析系列以一条简单的命令开始,ffplay -i a.mp4。a.mp4下载链接:百度网盘,提取码:nl0s 。如下图所示,本文主要讲解 streams_open() 函数的内部逻辑。如上图所示,streams_open() 里面比较重要的函数就是 初始化 frame_queue 跟 packet_queue,我画一个数据结构图会更容易理解。数据结构图,我画着画着,不小心画出了整体的数据关系原创 2022-01-24 17:37:37 · 700 阅读 · 0 评论 -
FFplay源码分析-stream_component_open
本系列 以 ffmpeg4.2 源码为准,下载地址:链接:百度网盘 提取码:g3k8FFplay 源码分析系列以一条简单的命令开始,ffplay -i a.mp4。a.mp4下载链接:百度网盘,提取码:nl0s 。上一篇文章已经讲解完了 stream_component_open() 的逻辑,这篇文章主要讲解 audio_thread(),音频解码线程的内部逻辑。因为解码线程里面涉及到了 struct Decoder,PacketQueue,FrameQueue的操作,所以必须先简单介绍一下这些原创 2022-02-11 09:00:56 · 621 阅读 · 0 评论 -
FFplay源码分析-read_thread
FFplay源码分析-read_thread本系列 以 ffmpeg4.2 源码为准,下载地址:链接:百度网盘 提取码:g3k8FFplay 源码分析系列以一条简单的命令开始,ffplay -i a.mp4。a.mp4下载链接:百度网盘,提取码:nl0s 。如下图所示,本文主要讲解 read_thread() 函数的内部逻辑。这个流程图是根据上面的命令ffplay -i a.mp4 画的,有些流程我省略了,因为不会执行某些代码,所以有些if判断我没画出来,为了简洁。从上面的流程图可以看出, r原创 2022-02-11 02:42:36 · 2995 阅读 · 4 评论