当前位置: 首页 > wzjs >正文

制作网站的软件叫什么移动外包公司要不要去

制作网站的软件叫什么,移动外包公司要不要去,网站服务器怎么配置,龙华做网站 熊掌号目录 🌈前言🌈 📁 整体架构 详细流程 📁 数据流向​ 📁 队列设计​编辑 📁 线程设计 📁 音视频同步 📁 音频输出设计 📁 视频输出设计 📁 总结 …

目录

🌈前言🌈    

📁 整体架构 + 详细流程

📁 数据流向​

📁 队列设计​编辑

📁 线程设计

 📁 音视频同步

📁 音频输出设计

📁 视频输出设计

📁 总结


🌈前言🌈    

        这篇文章是我在学习FFmpeg时,看到一位UP主的开源项目。我认为还是比较好认,通过和这个项目可以快速入门FFmpeg 7。

        因为种种原因,目前网上关于FFmpeg 7.x 版本相关介绍太少,并且相较于之前版本,接口有很大变化,学习途中可能有很大困恼。因此,我希望通过这个项目和我的理解,带大家快速入门FFmpeg以及7版本以上的接口使用流程。

        这篇文章的图片和源码均来自B站UP主:程序员老廖音视频入门必备项目-最新FFmpeg7.1播放器开发_哔哩哔哩_bilibili。

        我也将该项目做了一遍,并且将源码上传至Gitee,大家可以直接进行下载。

AVPlayer: 本地音乐播放器(FFmpeg + SDL)

📁 整体架构 + 详细流程

1. 初始化:创建并初始化必要的队列、线程和组件。

2. 媒体处理:

        i. 解复用线程从文件读取数据包。

       ii. 解码线程将数据包解码为帧。

      iii. 音视频输出模块将帧渲染输出。

3. 用户交互: 处理用户事件,如暂停、退出等。

4.  资源释放: 程序结束时按照正确的顺序释放资源,避免内存泄露

📁 数据流向

1. 解复用阶段:
        DemuxThread读取媒体文件
        分离音视频数据包
        将音视频包放入对应的AVPacketQueue
2. 解码阶段:
        DecodeThread从AVPacketQueue获取数据包
        使用FFmpeg解码器解码数据包
        生成音视频帧并放入AVFrameQueue
3. 渲染阶段:
        AudioOutput/VideoOutput从AVFrameQueue获取帧
        处理帧数据(重采样、格式转换等)
        通过SDL渲染到输出设备

📁 队列设计

1. 模板设计:使用C++模板实现通用队列结构,提高代码复用率

2. 线程安全:使用互斥锁和条件变量保证多线程环境下的数据一致性

3. 特化实现:为AVPacket和AVFrame提供特化队列,处理FFmpeg资源的引用计数

4. 终止机制:通过abort标志控制队列终止,实现优雅退出

5. 资源管理:

        AVPacketQueue负责管理AVPacket资源,使用av_packet_free释放
        AVFrameQueue负责管理AVFrame资源,使用av_frame_free释放

        在Queue中加锁解锁的操作会用到两个管理类 (当然可以都使用第二个):

std::lock_guard (简单锁): 
        1. 轻量级, 性能更高, 无额外开销
        2. 严格作用域锁: 不能手动控制
        3. 不可转移所有权
        4. 不支持条件变量

std::unique_lock (灵活锁):
        1. 功能更强大, 有额外的状态存储
        2. 支持手动的加锁解锁
        3. 支持所有权转移
        4. 支持条件变量

📁 线程设计

1. 基类封装:Thread基类封装线程创建,启动和停止的通用逻辑

2. 虚函数机制:通过纯虚函数Run要求派生类实现具体的业务逻辑

3. 状态控制:使用abort控制线程循环状态,实现退出

4. 资源管理:

        DemuxThread管理文件读取和格式解析资源(AVFormatContext)
        DecodeThread管理解码器资源(AVCodecContext)

5. 线程协作

        通过队列实现线程间数据传递,解耦生产者和消费者

 📁 音视频同步

1. 主时钟选择:
        i. 使用音频PTS作为主时钟基准
       ii. 音频在回调函数中更新时钟值
2. 视频同步策略:
        i. 计算视频帧PTS与当前音频时钟的差值
       ii. 差值为正(视频超前):延迟显示
      iii. 差值为负(视频滞后):立即显示
     iiii. 差值过大:考虑跳帧或重复帧

3. 时钟管理:
        i. AVSync类提供时钟读写接口
       ii. 音频线程设置时钟
      iii. 视频线程读取时钟

        AVSync中记录一个动态变差值,可以简单理解为记录音频的pts。

为什么不能直接保存音频的pts呢?

  1. pts只在音频回调时更新​​,而视频可能在任意时刻查询 GetClock()

    • 如果音频回调间隔是 10ms,而视频在两次回调之间查询 GetClock(),它拿到的 pts是 ​​过时的​​(没有考虑这期间的时间流逝)。

    • ​结果​​:视频计算的时间偏差不准确,导致音画不同步。

  2. ​无法处理音频播放速度变化​​(如加速、卡顿)。

    • 如果音频因缓冲不足而卡顿,pts更新变慢,但系统时间仍在流逝。

    • 直接返回 _current_audio_pts无法反映这种延迟。

📁 音频输出设计

        声音输出模块负责从帧队列取出音频帧,进行必要的重采样,并通过SDL输出音频。

1. 初始化流程:

        i. 初始化SDL音频播放子系统

       ii. 设置音频参数

      iii. 设置音频回调函数

     iiii. 创建重采样上下文(如果需要)

2. 回调机制:

        i. SDL音频系统在需要数据时调用设置的回调函数

       ii. 回调函数从帧队列获取音频帧

      iii. 根据需要进行重采样 (使用SwrContext)

     iiii. 将处理后的音频数据填充到SDL提供的缓冲区

3. 音频时钟:

        i. 以音频PTS为主时钟

       ii. 在每次回调中更新音频时钟

      iii. 作为视频同步的基准

4. 资源管理:

        i. 管理重采样上下文(SwrContext)

       ii. 管理音频缓冲区

      iii. 在Delnit和析构函数中释放资源

        AVRational 是 FFmpeg 中用于表示 ​​分数(有理数)​​ 的结构体,主要用于时间基(time base)、帧率(frame rate)、采样率(sample rate)等场景

📁 视频输出设计

        画面输出模块负责从帧队列获取视频帧,与音频同步,并通过SDL渲染到屏幕

1. 初始化流程:
        初始化SDL视频子系统
        创建窗口和渲染器
        创建纹理用于视频渲染
2. 主循环机制:
        处理SDL事件(如退出、按键等)
        刷新视频帧
        控制帧率以实现音视频同步
3. 同步策略:
        比较视频帧PTS与音频时钟
        如果视频超前,等待适当时间再显示
        如果视频滞后,立即显示并可能丢帧
4. 渲染过程:
        将YUV数据更新到SDL纹理
        将纹理渲染到窗口
        释放已显示的帧

5. 资源管理:
        管理SDL资源(窗口、渲染器、纹理)
        在DeInit和析构函数中释放资源

📁 总结

        以上就是该项目的整体流程,相对来说还是比较简单的。我认为将这个项目跑一边,对于重点代码写一遍,那么对FFmpeg 7版本的接口就会有比较深刻的印象了,例如解封装,解码,转码等内容。


文章转载自:

http://4RcHTHNp.qwmsq.cn
http://Duus6FW7.qwmsq.cn
http://fquaMvFd.qwmsq.cn
http://A0Oo7rDz.qwmsq.cn
http://fJVFRZqR.qwmsq.cn
http://TIFOdgox.qwmsq.cn
http://TpLysQ8k.qwmsq.cn
http://gFTlCVo8.qwmsq.cn
http://hitldLQD.qwmsq.cn
http://VPJmII87.qwmsq.cn
http://VwIkR7vV.qwmsq.cn
http://31Boz8EY.qwmsq.cn
http://z4Mu0ETY.qwmsq.cn
http://wvQ6kAUX.qwmsq.cn
http://B2sW4qqz.qwmsq.cn
http://EpdG0S8y.qwmsq.cn
http://VEzzsUAF.qwmsq.cn
http://B2bsCV1t.qwmsq.cn
http://mMpGX2Zu.qwmsq.cn
http://nhFKWR69.qwmsq.cn
http://oqUnmFHJ.qwmsq.cn
http://5ecHdlWU.qwmsq.cn
http://6gvNqUoh.qwmsq.cn
http://QB3EcTBD.qwmsq.cn
http://fTrxpnNl.qwmsq.cn
http://AGA6rGRm.qwmsq.cn
http://t0K4k2Gn.qwmsq.cn
http://3Z6FzPKY.qwmsq.cn
http://kIxCfLXI.qwmsq.cn
http://iQwhuOte.qwmsq.cn
http://www.dtcms.com/wzjs/700685.html

相关文章:

  • 济宁网站建设(北京智能网站建设哪里有
  • 网站建设项目的生命周期wordpress插件位置
  • 专门做音乐的网站湖南产品网络推广业务
  • 如何验证网站所有权软件开发的模式
  • 七牛怎么做网站服务器99个创意营销方案
  • 北京网站优化托管室内设计师联盟首页
  • 自已建外贸网站厂房设计
  • 建网站服务器怎么选wordpress在线编辑慢
  • 网站建设的文件wordpress文章的分享
  • 做网站要找什么红色系网站
  • 如何做好网站首页wordpress 多标签筛选
  • 大学电子系的建设网站的方案定期做图书推荐的网站
  • 烟台做网站那家好网站建设的要点是什么意思
  • 张家口网站设计网络教学网站建设
  • 成品网站创意创新设计方案
  • 有源码后怎么做网站mysql网站数据库
  • 机场建设网站商城网站建设哪个比较好
  • 租房网站开发视频教程乡镇网站建设方案
  • jsp网站开发之html入门知识敬请期待的近义词
  • 体验做黑客的网站网络品牌营销方案
  • 长沙网站制作主要公司推广平台有哪几个
  • 上海网站推广很好苏州高端网站开发
  • php网站开发实例视频教程管理咨询公司收费标准报价单
  • 青海专业网站建设推广平台建设高碑店做网站的公司
  • 网站设计的公司价格python 做视频网站
  • wordpress企业建站流程网站业务怎么做
  • 当当网网站开发计划和预算新手学做网站 pdf 网盘
  • 网站设计首页深圳网站设计技术
  • 主题网站开发介绍重庆网站建设建站收费
  • 改版一个网站多少钱公众号怎么做链接