- 博客(15)
- 收藏
- 关注
原创 ffplay源码分析__音视频同步compute_target_delay
1、由于计算机系统大部分是分时系统,所以当负载过高或者设备性能差的时候,音频播放线程或者视频播放线程会出现调度不及时,导致视频画面已经更新了,但是声音还没放出来。2、视频和音频的解码速度也不一样,解码出来的数据也不一定马上就可以显示出来。3、视频和音频是两个独立的任务在运行,一帧的播放时间,难以精准控制。音视频解码及渲染的耗时不同,可能造成每一帧输出有一点细微差距,长久累计,不同步便越来越明显。
2025-05-09 17:10:16
940
原创 ffplay源码分析__audio_decode_frame()
audio_decode_frame函数主要功能是从FrameQueue中取出解码后的音频数据,判断是否需要重采样。如果需要,把音频数据重采样后再给SDL使用。audio_decode_frame()可以分为三部分。第一部分从音频FrameQueue中读取解码后的音频数据,第二部分判断是否需要重采样,第三部分是重采样功能。
2025-05-02 17:45:08
743
原创 ffplay源码分析__解码函数decoder_decode_frame
decoder_decode_frame函数的主要功能是:判断从PacketQueue取出的MyAVpacketList序列号是否和Decoder的序列号一致,如果两者不一致,就一直从队列中取,直到取到的序列号一致为止。如果两者序列号一致,就用avcodec_send_packet函数向解码器输送数据,然后通过avcodec_receive_frame从解码器获取解码后的数据返回。正确取到解码数据后返回1,读取到解码器末尾时返回0,其余返回负数。
2025-04-22 11:38:41
1053
原创 win10环境下msys+vs2022编译ffmpeg6.1
本文是在windows10,msys2+vs2022的环境下,编译ffmpeg6.1。
2025-04-21 21:52:23
929
原创 ffplay源码_video_display函数分析
本文分析了ffplay视频渲染核心函数video_display()的实现原理。该函数通过SDL2库将解码后的AVFrame渲染到屏幕,主要流程包括:1)初始化SDL窗口参数;2)设置背景色并清空缓冲区;3)根据视频格式创建或更新纹理;4)计算显示区域;5)复制纹理到渲染目标;6)提交渲染。关键点在于处理FFmpeg与SDL像素格式的映射转换,通过sws_scale()进行格式转换,使用SDL_RenderCopyEx()实现纹理渲染,最终调用SDL_RenderPresent()显示画面。
2025-04-17 16:49:08
63
原创 ffplay源码__音频解码线程audio_thread
audio_thread主要功能是从音频PacketQueue中读取数据并解码,然后把解码后的数据插入到音频FrameQueue中。audio_thread和video_thread基本流程一致,都用到解码函数decoder_decode_frame(),队列函数frame_queue_peek_writable()和frame_queue_push()。
2025-04-12 19:08:59
696
原创 ffplay源码分析__视频解码线程video_thread
video_thread线程是在read_thread线程中创建的,主要作用是从视频PacketQueue队列中获取AVPacket数据用于解码,并把解码后的数据封装成Frame,保存到视频的FrameQueue中。真正的解码是在decoder_decode_frame()中完成。把解码数据插入到队列是用三个函数完成,分别是frame_queue_peek_writable(),queue_picture(),frame_queue_push()。
2025-04-10 10:25:17
704
原创 ffplay源码分析__音频回调sdl_audio_callback
sdl_audio_callback 函数在 SDL 音频处理中扮演关键角色,它在单独的线程中被调用,负责向 SDL 音频驱动填充音频数据。该函数通过 audio_decode_frame 从音频帧队列中获取解码数据,并根据需要进行重采样。随后,数据被填充到 SDL 音频缓冲区中,如果缓冲区未满,则继续填充;如果发生错误,则输出静音。SDL 采用双缓冲机制,确保音频的连续播放。此外,音频时钟的更新依赖于缓冲区的填充状态,通过计算剩余数据和时间戳来同步音频播放时刻。
2025-04-08 17:52:19
30
原创 ffplay源码__stream_component_open函数分析
1、stream_component_open函数是在read_thread子线程被调用的。其中有三个地方调用了stream_component_open()函数,实际运行时只有音频和视频部分生效,所以又产生了两个子线程audio_thread和video_thread。
2025-03-17 11:26:47
680
原创 ffplay源码_read_thread线程分析(三)
本文详细介绍了在VS2017的Debug x86模式下调试运行FFplay的初始化过程。首先,通过SDL_CreateMutex()创建wait_mutex锁,用于配合SDL_CondWaitTimeout函数。接着,初始化媒体索引数组并分配AVPacket和AVFormatContext的内存。然后,设置中断回调函数和字典,用于处理耗时操作和传递额外参数。通过avformat_open_input()函数打开媒体文件,并获取媒体信息。随后,判断是否为网络流,并查找最佳媒体流。最后,打开音视频流,读取文件数
2025-03-12 13:08:49
936
原创 ffplay源码分析__stream_open函数(二)
本文分析了FFplay播放器的核心数据结构和初始化过程。重点解析了VideoState全局管理器的结构,包含音视频时钟、帧队列和解码器等关键组件;详细说明了FrameQueue、PacketQueue等核心数据结构的实现原理;并深入探讨了播放器初始化的各个步骤,包括参数设置、队列初始化、时钟同步机制建立等。通过VS2017环境下的调试分析,揭示了FFplay内部如何管理多媒体播放的全局状态,为理解其播放机制提供了基础框架。
2025-03-11 09:17:32
848
原创 win10环境下msys2+vs2017编译ffmpeg(64位含ffplay)
本文在win10下用msys2和vs2017编译ffmpeg 64位(包含ffplay),以及把ffplay.c移植到vs2017环境中,便于学习。ffmpeg 的源码是跨平台的,通过 configure(shell脚本) 实现不同平台的编译规则。在 configure 的时候指定--toolchain=msvc就可以使用 msvc 来编译 ffmpeg。
2024-11-29 12:07:19
1893
原创 win10环境下msys2+vs2017编译ffmpeg(32位含ffplay移植)
本文在win10下用msys2和vs2017编译ffmpeg32位。ffmpeg 的源码是跨平台的,通过 configure(shell脚本) 实现不同平台的编译规则。在 configure 的时候指定就可以 使用 msvc 来编译 ffmpeg。
2024-11-22 15:21:08
1952
原创 win10环境下msys2+mingw编译ffmpeg(64位含ffplay)
windows下用msys2 mingw64环境编译ffmpeg64位,包含ffplay.exe
2024-11-17 11:21:05
2434
ffplay.c+vs2017工程文件(ffplay播放器)
2025-02-12
windows环境下ffmpeg4.4.5-64位库文件(含ffplay).rar
2025-02-11
windows环境下ffmpeg4.4.5-32位库文件.rar
2025-02-11
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人