Giter Site home page Giter Site logo

cloveme / qt_ffmpeg_rtmp_player_demo Goto Github PK

View Code? Open in Web Editor NEW

This project forked from xssbyte/qt_ffmpeg_rtmp_player_demo

0.0 0.0 0.0 1.7 MB

qt+ffmpeg(+opengl)实现rtmp/rtsp音视频流播放器demo,功能简单,无锁消费,高性能

C++ 96.08% QMake 3.92%

qt_ffmpeg_rtmp_player_demo's Introduction

qt_ffmpeg_rtmp_player_demo

qt+ffmpeg+opengl实现rtmp/rtsp音视频流播放器,只有播放和停止,功能简单,代码简单,性能优秀。
优先保证实时性,不做音视频帧同步,适合对延时要求非常高的场景,比如rtsp摄像头拉流预览。

架构

单生产者单消费者模型,视频帧使用原子量做同步,生产消费过程无锁,只有需要消费才拷贝。音频帧生产消费通过环形缓冲区实现。
低耦合,解码只使用STL库和ffmpeg库,UI只使用STL库和qt库,无其他依赖项。

视频生产者video producer:

ffmpeg读取视频流+软解码+色彩空间转换,从原始rtsp流格式(一般是AV_PIX_FMT_YUV420P)统一转成AV_PIX_FMT_RGBA

视频消费者video consumer:

实现了两种方案,QWidget异步绘制和QOpenGLWidget同步绘制
QWidget方案,有一次额外深拷贝。这是为了保证qt框架异步消费时,图像还没有被析构。paintEvent到实际上屏的过程也是异步的,QPainter只是指向了传入的图像。如果paintEvent后马上析构图像,到qt框架异步消费时,正常还会有一次深拷贝,但是指向的图像已经析构了,就会造成垂悬指针。对于普通QWidget,qt框架没有提供同步消费的方案,因为如果同步消费回调里阻塞了,主线程就阻塞了,就会导致程序无响应。
QOpenGLWidget方案,没有额外的深拷贝,paintGL回调中调用的opengl函数都是同步函数,glTexSubImage2D传入纹理指针后,会被opengl深拷贝,之后释放图像数据指针就不会有垂悬指针的问题。

音频生产者audio producer:

ffmpeg读取音频流+软解码+音频重采样,重采样为pcm格式

音频消费者audio consumer:

QAudioOutput在open时,如果未设置QIODevice::Unbuffered,实时性很差,所以demo里对音频QIODevice禁用了qt内部缓冲。实现了一个环形缓冲区,缓存和实时播放音频帧,保证QAudioOutput始终有数据可读。QAudioOutput循环读环形缓冲区,ffmpeg循环写入环形缓冲区。格式一致的情况下播放延时是固定的,和环形缓冲区大小相关,缓冲区大延时高稳定性好,缓冲区小实时性好稳定性差,可以根据需求调整缓冲区大小。

同步和帧率控制

视频帧是单生产者单消费者,使用一个原子量做同步,更复杂的模型需要独立实现生产者消费者队列,超出demo的范围了。
帧率控制没有特意实现,update()有自动去重,所以只是利用了每一帧的回调,一般来说,控制取帧和抽帧频率,使用QTimer触发update()重绘即可。
每一帧的回调on_new_frame_avaliable和on_new_audio_frame_avaliable是用于同步消费或者做音视频同步或者存入缓冲区的。音视频同步不在demo的范围内了。

TODO

视频画面缩放,音频播放流程优化

依赖和编译

需要修改pro文件中的ffmpeg库的库和头文件的路径
直接build,注意64位还是32位,并把ffmpeg的库拷贝到build出来的文件夹中
img
延时效果 img

qt_ffmpeg_rtmp_player_demo's People

Contributors

xssbyte avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.