FFplay播放器的命令行是可以指定多个视频滤镜,然后按 w 键切换查看效果的,命令如下
FFplay是如何解析命令行参数的
FFplay退出逻辑分析
FFplay 播放器有一个比较有趣的功能,就是逐帧播放。因为平时视频文件的帧率是挺高的,一秒24帧,有些细节一瞬间就过去了,不太容易注意到。利用逐帧播放功能,你可以一帧一帧的观察视频画面,在查处交通违规,案件排查的场景非常有用。你可以在 FFplay 播放器运行过程中,按 S 键进入逐帧播放模式,不断按 S 键可以
暂停也是播放器非常常见的功能。对于 FFplay 播放器,可以通过 p 键 或者空格键 来切换暂停状态。
播放器的最常用的功能之一 就是快进快退,快进快退的本质就是让视频文件跳转到另一个时间点来播放。
FFplay 播放器有 3 个时间:1,视频流的播放时刻,(视频时钟)2,音频流的播放时刻,(音频时钟)3,预定的时间,预定的播放时刻,实际上就是物理世界的自然时间,(外部时钟)上图中的 14:00:00:123 就是其中一个预定的时间,完全准确的情况下,会在 14:00:00:123 播放第 4 帧视频 ,播放第 7 帧音频。但是,计算机系
本文是讲解当视频时钟设置为主时钟的时候,音视频同步的逻辑。可以通过以下命令设置 视频时钟为主时钟:ffplay -sync video -i juren-30s.mp4当视频时钟设置为主时钟的时候,is->av_sync_type 等于 AV_SYNC_VIDEO_MASTER,之前在《FFplay视频同步分析》提到的3处视频同步的代码,全部都会失
FFplay视频分析
音视频同步基础知识
video_refresh视频播放线程分析
video_thread 线程主要是负责 解码 PacketQueue 队列里面的 AVPacket 的,解码出来 AVFrame,然后丢给入口滤镜,再从出口滤镜把 AVFrame 读出来,再插入 FrameQueue 队列。
audio_decode_frame() 函数的主要作用是从 FrameQueue 队列里面读取 AVFrame ,然后把 is->audio_buf 指向 AVFrame 的 data。如果 AVFrame 的 音频格式跟 is->audio_tgt 不一致,就会进行重采样,如果进行重采样, is->audio_buf 指针会执行重采样后的内存 audio_buf1,而不是 AVFrame::data。
sdl_audio_callback音频播放线程分析
序列号 主要是给 快进快退 这个功能准备的。如果不能快进快退,那其实就不需要序列号。只要解复用线程不断读取 AVPacket 放进去 PacketQueue 队列,解码线程不断从 PacketQueue 取数据来解码放进去 FrameQueue,最后有播放线程来取 FrameQueue 的数据取播放就行。
FFplay 播放器有两种队列,PacketQueue 跟 FrameQueue。FrameQueue 的数据就是从 PacketQueue 里面解码出来的(会经过滤镜)。PakceQueue 是用 FifoBuffer 来实现环形队列的,而FrameQueue 是用数组来实现一个环形队列的,但是更复杂一些。
decoder_decode_frame() 其实是一个通用的解码函数,可以解码 音频,视频,字幕的 AVPacket。不过本文主要侧重于分析音频流的解码,但其他的流也是类似的逻辑。
udio_thread线程实际上就是音频解码线程,audio_thread线程主要是负责解码PacketQueue队列里面的AVPacket的,解码出来 AVFrame,然后丢给入口滤镜,再从出口滤镜把 AVFrame读出来,再插入FrameQueue队列
audio_open函数分析
configure_audio_filters() 函数的作用主要是配置 音频流的 滤镜,因为 ffplay 为了代码的通用性,即便命令行参数不使用滤镜,AVFrame 也会过一遍 空滤镜做下样子。
stream_component_open()` 函数主要作用是打开数据流对应的解码器,开启解码线程去解码。
ffplay 的 read_thread线程分析
在讲 stream_open() 函数之前,需要先了解 stream_open() 里面使用到的一些基本的数据结构。如下:第一个数据结构是 struct VideoState ,VideoState 可以说是播放器的全局管理器。字段非常多,时钟,队列,解码器,各种状态 都放在 VideoSt
在前文《FFmpeg的API库介绍》里面知道,FFmpeg 一共提供了 8 个 dll 库给外部使用,但是有时候为了软件的安装目录的文件更加简洁一点,会把这 8 个 dll 动态库全部合并进去一个 ffmpeg.dll 里面,挺多软件都这样做的,例如:Typora,draw.io,百度翻译,等等。下面就来介绍如何生成 ffmpeg.dll,在
在开始分析之前,讲一个 makefile 的调试技巧,推荐阅读《如何调试MAKEFILE变量》make -f Makefile -f vars.mk HOSTPROGS这里我对 vars.mk 做了点修改,因为源 vars.mk 没处理特殊字符,直接 echo 会报错。ff
</title> <meta name="description" content="为什么要做内存对齐呢?为了提高内存的访问效率,举个例子。 因为某些32位的 CPU,每个总线周期都是从偶地址开始读取32位的内存数据的,假设一个 `int` 变量的地址是 `0x01`,当 执行汇编指令 `mov %eax,0x01` 的时候,CPU 内部需要做比较多的额外的功能,首先CPU 从 `0x00` 开始读取 4 字节数据,然后把第一个字节丢弃,然后从 `0x04` 开始再读取 4 字节,把后面 3个字节丢弃,然后把第一次 读到的 3 字节数据 跟第二次读到的 1 个字节数据合并在一起,然后再 `mov` 到 `eax` 寄存器。 不过这个过程是 CPU 内部做的,你在汇编代码是看不见这个过程的。不过由于内存不对齐,CPU 干了这么多额外的时间,肯定会有性能损耗,这是可以测试出来的
Fmpeg 是一个 C程序的项目,C语言是需要手动管理内存的。内存管理有一个技巧,只要你分清楚这个变量是在栈上,还是在堆上的就可以了。在栈上的变量不需要手动释放,而在堆上的变量需要自己释放
ffmpeg 支持从网络流 或者本地文件读取数据,然后拿去丢给解码器解码,但是有一种特殊情况,就是数据不是从网络来的,也不再本地文件里面,而是在某块内存里面的。这时候 av_read_frame() 函数怎样才能从内存把 AVPacket 读出来呢?
在做音视频数据分析的时候,经常会遇到这样的需求,每隔5分钟抽取一帧数据进行分析。在做播放器开发的时候,也会遇到这种情况,就是拖动进度条跳转到某个位置进行播放。
在做音频处理的时候,我们有时候需要调整音频流的采样率 或者 采样格式,可能是喇叭不支持 48000 采样率,所以需要降低到 44100 采样了.也可能因为各种业务原因,需要调整 采样率,采样格式,或者声道布局。FFmpeg 提供了 swr_convert() 函数来实现上面的功能。需要注意的是,调整采样率,是不会影响音频流的播放时长的,原来是 10 分钟的音频文件,你调高或者降低采样率,它还是 10 分钟的播放时长。
Copyright © 2005-2024 51CTO.COM 版权所有 京ICP证060544号