五、基于FFmpeg和SDL的视频播放器(同步版)

    xiaoxiao2025-03-05  36

    前言

    查看了很多的博客,发现大部分的音频和视频同步代码都有问题(估计是代码的实现方式不同)现摸索出一个超简易的音频视频同步的代码,思路如下:如有问题希望大家指正

    一、DTS、PTS

    DTS、PTS 的概念如下所述:

    DTS(Decoding Time Stamp):即解码时间戳,这个时间戳的意义在于告诉播放器该在什么时候解码这一帧的数据。PTS(Presentation Time Stamp):即显示时间戳,这个时间戳用来告诉播放器该在什么时候显示这一帧的数据。

    而我们获取的AVPacket包中包含着这些信息,所以我们可以使用PTS来进行视频的同步

    二、获取音频的播放时间

    ptsAudio = av_q2d(pFormatCtx->streams[indexAudio]->time_base) * packetAudio->pts * 1000; packetAudio->pts:获取时间戳av_q2d(pFormatCtx->streams[indexAudio]->time_base) :获取time_base(一个时间戳对应的时间单位微秒)*1000 :转化为毫秒

    三、获取视频的播放时间

    ptsVideo = av_frame_get_best_effort_timestamp(pFrame)*av_q2d(pFormatCtx->streams[indexVideo]->time_base) * 1000;

    注:av_frame_get_best_effort_timestamp(pFrame)其实大多数和packetVideo->pts的值一样,但是使用前面的有优化

    四、设置视频的延时

    if (ptsVideo > ptsAudio) { SDL_Delay(ptsVideo -ptsAudio); }

    注:当图片播放早于声音时候,快速播放图片。当图片晚于声音时,添加延时播放

     

    代码链接:https://download.csdn.net/download/z345436330/11205825

    QT版:https://github.com/ZhouHanyu18/SimplePlayer

    编译环境参考前面博客:https://blog.csdn.net/z345436330/article/details/90474644

    将前面audio和video代码合并在一起,增加队列来存储packet包

    如上就可以简单的实现音频与视频的同步了

    以上纯属个人观点仅供参考,如有问题欢迎指出~~

     

     

    最新回复(0)