千家信息网

Qt如何实现ffmpeg音视频同步

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,这篇文章将为大家详细讲解有关Qt如何实现ffmpeg音视频同步,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、前言用ffmpeg来做音视频同步,个人认为这个是ff
千家信息网最后更新 2026年11月03日Qt如何实现ffmpeg音视频同步

这篇文章将为大家详细讲解有关Qt如何实现ffmpeg音视频同步,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

一、前言

用ffmpeg来做音视频同步,个人认为这个是ffmpeg基础处理中最难的一个,无数人就卡在这里,怎么也不准,本人也是尝试过网上各种demo,基本上都是渣渣,要么仅仅支持极其少量的视频文件比如收到的数据包是一帧视频一帧音频的,要么根本没法同步歪七八糟的,要么进度跳过去直接蹦蹦蹦崩溃的,其实最完美的音视频同步处理demo就是ffplay,我亲测过几十种各种各样的音视频本地文件,数十种视频流文件,都是非常完美,当然啦这是亲生的啦,不完美还玩个屁。

如果仅仅是播放视频流(不带音频流),可能不需要音视频同步,所以最开始只做rtsp视频流播放的时候根本没有考虑同步的问题,因为没遇到也不需要,等到后期发现各种rtmp、http、m3u8这种视频流的时候,问题大了去了,他是hls格式的视频流文件一次性过来的,一个个小视频文件过来的,如果没有同步的话,意味着突然之间刷刷刷的图片过去很多,下一次来的又是刷刷的,这就需要自己计算同步了,上次接收到的数据包放入队列,到了需要显示的时候就显示。

常用的音视频同步方法:

  1. 通过fps来控制,fps表示一秒钟播放多少帧,比如25帧,可以自行计算一帧解码用掉的时间,一帧占用(1000/25=40毫秒),通过延时来处理,这其实是最渣渣的办法。

  2. 记住开始解码的时间startTime,通过av_rescale_q计算pts时间,两者的差值就是需要延时的时间,调用av_usleep来延时,这种只有部分文件正常,很多时候不正常。

  3. 音频同步到视频,视频时钟作为主时钟,没试过,网上很多人说这个办法不好。

  4. 视频同步到音频,音频时钟作为主时钟,没试过,据说大部分人采用的此办法。

  5. 音视频同步到外部时钟,外部时钟作为主时钟,最终采用的办法,容易理解互不干扰,各自按照外部时钟去同步自己。

  6. ffplay自身内置了三种同步策略,可以通过参数来控制采用何种策略,默认是视频同步到音频。

二、功能特点

  1. 多线程实时播放视频流+本地视频+USB摄像头等。

  2. 支持windows+linux+mac,支持ffmpeg3和ffmpeg4,支持32位和64位。

  3. 多线程显示图像,不卡主界面。

  4. 自动重连网络摄像头。

  5. 可设置边框大小即偏移量和边框颜色。

  6. 可设置是否绘制OSD标签即标签文本或图片和标签位置。

  7. 可设置两种OSD位置和风格。

  8. 可设置是否保存到文件以及文件名。

  9. 可直接拖曳文件到ffmpegwidget控件播放。

  10. 支持h365视频流+rtmp等常见视频流。

  11. 可暂停播放和继续播放。

  12. 支持存储单个视频文件和定时存储视频文件。

  13. 自定义顶部悬浮条,发送单击信号通知,可设置是否启用。

  14. 可设置画面拉伸填充或者等比例填充。

  15. 可设置解码是速度优先、质量优先、均衡处理。

  16. 可对视频进行截图(原始图片)和截屏。

  17. 录像文件存储支持裸流和MP4文件。

  18. 音视频完美同步,采用外部时钟同步策略。

  19. 支持seek定位播放位置。

  20. 支持qsv、dxva2、d3d11va等硬解码。

  21. 支持opengl绘制视频数据,极低CPU占用。

  22. 支持安卓和嵌入式linux,交叉编译即可。

三、效果图

核心代码

void FFmpegSync::run(){    reset();    while (!stopped) {        //暂停状态或者队列中没有帧则不处理        if (!thread->isPause && packets.count() > 0) {            mutex.lock();            AVPacket *packet = packets.first();            mutex.unlock();            //h364的裸流文件同步有问题,获取不到pts和dts,暂时用最蠢的办法延时解决            if (thread->formatName == "h364") {                int sleepTime = (1000 / thread->videoFps) - 5;                msleep(sleepTime);            }            //计算当前帧显示时间 外部时钟同步            ptsTime = getPtsTime(thread->formatCtx, packet);            if (!this->checkPtsTime()) {                msleep(1);                continue;            }            //显示当前的播放进度            checkShowTime();            //0-表示音频 1-表示视频            if (type == 0) {                thread->decodeAudio(packet);            } else if (type == 1) {                thread->decodeVideo(packet);            }            //释放资源并移除            thread->free(packet);            mutex.lock();            packets.removeFirst();            mutex.unlock();        }        msleep(1);    }    clear();    stopped = false;}bool FFmpegSync::checkPtsTime(){    bool ok = false;    if (ptsTime > 0) {        if (ptsTime > offsetTime + 100000) {            bufferTime = ptsTime - offsetTime + 100000;        }        int offset = (type == 0 ? 1000 : 5000);        offsetTime = av_gettime() - startTime + bufferTime;        if ((offsetTime <= ptsTime && ptsTime - offsetTime <= offset) || (offsetTime > ptsTime)) {            ok = true;        }    } else {        ok = true;    }    return ok;}

关于"Qt如何实现ffmpeg音视频同步"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

同步 视频 文件 时钟 支持 音视 视频流 音频 可设 办法 时间 处理 时候 位置 图片 数据 标签 策略 篇文章 要么 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 蓝思科技飞鸽互联网 为想互联网科技怎么样 中国互联网科技工作委员会毛军 关于新基建和互联网科技 互联网金融公司科技 中国 科技 互联网 互联网科技集团 互联网科技论文 火传媒上海互联网科技 中国互联网有什么科技含量 武汉健翔互联网络科技有限公司 浙南科技城互联网大厦建设工程 威龙国际互联网科技公司 宁波跨境商互联网科技有限公司 广西科技产业互联网是什么 山东蛋芒互联网科技有限公司 陕西彩京云互联网科技有限公司 互联网科技大佬云集 宁波允成互联网科技有限公司 颐高云石互联网科技 互联网核心科技是什么 盈实互联网科技 互联网科技有限公司图片 中国 科技 互联网 亿账通互联网科技 成都狮子座互联网科技 海南购全球互联网科技 湖南诚度互联网科技有限公司 互联网公司黑科技创始人 广东鹅鹅鹅互联网科技有限公司
0