SDL播放YUV格式视频
代码
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879#include "sdlqtrgb.h"#include <sdl/SDL.h>#include <QMessageBox>#include <iostream>#include <fstream>#pragma comment(lib, "SDL2.lib")static int sdl_width = 0;static int sdl_height = 0;static SDL_Window* sdl_win = nullptr;static SDL_Renderer* sdl_render = nullptr;static SDL_Texture* sdl_texture = nullptr; ...
使用SDL将两幅图片合并
代码
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115#include "sdlqtrgb.h"#include <sdl/SDL.h>#include <QMessageBox>#include <iostream>#pragma comment(lib, "SDL2.lib")static int sdl_width = 0;static int sdl_height = 0;static SDL_Window* sdl_win = nullptr;static SDL_Renderer* ...
使用SDL进行RGB渲染
代码
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091#include "sdlqtrgb.h"#include <sdl/SDL.h>#include <iostream>#pragma comment(lib, "SDL2.lib")static int sdl_width = 0;static int sdl_height = 0;static SDL_Window* sdl_win = nullptr;static SDL_Renderer* sdl_render = nullptr;static SDL_Texture* sdl_texture = nullptr;static unsigned char* rgb = ...
ffmpeg 搜索栏
项目地址。
XVideoView。
XVideoView是XSDL的基类。
XVideoView作用:
将传入的AVCodecParameters交给XSDL,用于处理sdl初始化
读取每一帧的数据
将传入的文件打开
根据传入的参数,返回XVideoView类,默认为XSDL
计算 fps,根据 format 进行绘制,Draw () 函数在基类 XSDL 中
XSDL。
XSDL继承于XVideoView。
XSDL作用:
初始化sdl
检查sdl窗口是否关闭
清理材质、渲染器、窗口句柄指针
处理YUV或RGB格式,渲染到sdl窗口上
XCodec。
XCodec是编解码的基类,也就是XEncode、XDecode的基类
XCodec作用:
根据传入的参数,新创建并返回解码器或编码器AVCodecContext(关于AVCodecContext介绍在这里)
设置类中的编解码器上下文AVCodecContext
设置类中编解码器上下文一些参数
打开编解码器
根据上下文AVCodecContext创建一个AVFrame
XEncode。
继承于XCodec
XEnco ...
XViewer Project
main.cpp
作为Qt的启动函数,通过创建XViewer对象。
然后调用show()函数在屏幕上进行显示。
接着调用exec()函数,启动Qt的循环事件,此时程序可以处理用户输入的一些请求。
12345678910int main(int argc, char *argv[]){ QApplication a(argc, argv); XViewer w; w.show(); auto re = a.exec(); // xr.Stop(); return re;}
xviewer
xviewer.h
用于第一个Qt创建的对象,可以通过自定义函数进行一些关于界面事件的处理。
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566#pragma once#include <QtWidgets/QWidget>#include "ui_xviewer. ...
XDemuxTask
XDemuxTask.h
123456789101112131415161718192021222324252627282930313233343536373839404142#pragma once#include "xtools.h"#include "xdemux.h"enum XSYN_TYPE{ XSYN_NONE = 0, // 不做同步 XSYN_VIDEO = 1, // 根据视频同步,不处理音频};class XDemuxTask : public XThread{public: void Main(); // 打开解封装 // url: rtsp地址 // timeout_ms:超时时间 单位毫秒 bool Open(std::string url, int timeout_ms = 1000); // 复制视频参数 std::shared_ptr<XPara> CopyVideoPara() { return demux_.CopyVideoPara(); ...
XDemux
XDemux.h
1234567891011121314151617#pragma once#include "xformat.h"class XDemux : public XFormat{public: // 打开解封装 解封装地址支持rtsp 失败返回nullptr static AVFormatContext *Open(const char *url); // 读取一帧数据 // pkt: 输出数据 // return 是否成功 bool Read(AVPacket *pkt); bool Seek(long long pts, int stream_index);};
XDemux.cpp
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768#include "xdemux.h"#include <ios ...
XDecodeTask
XDecodeTask.h
12345678910111213141516171819202122232425262728#pragma once#include "xtools.h"#include "xdecode.h"#include "xcodec.h"class XDecodeTask : public XThread{public: // 打开解码器 bool Open(AVCodecParameters *para); // 责任链处理函数 void Do(AVPacket *pkt) override; // 线程主函数 void Main() override; // 线程安全,返回当前需要渲染的AVFrame,如果没有返回nullptr // need_view_控制渲染 // 返回结果需要用 XFreeFrame释放 AVFrame *GetFrame();private: std::mutex mux_; XDecode decode_; XAVPacketList pkt_list_; A ...
XMuxTask
XMuxTask.h
12345678910111213141516171819202122232425#pragma once#include "xtools.h"#include "xmux.h"class XMuxTask : public XThread{public: void Main() override; bool Open(const char *url, AVCodecParameters *video_para = nullptr, AVRational *video_time_base = nullptr, AVCodecParameters *audio_para = nullptr, AVRational *audio_time_base = nullptr ); void Do(AVPacket *pkt);private: XMux xmux_; XAVPacketList pkts_; // 一个线程安全的 AVPacket 列表,用于存储接收到的数据包。 std::mutex mux_; ...
XTools
XTools.h
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105#pragma once#include <thread>#include <iostream>#include <mutex>#include <list>struct AVPacket;struct AVCodecParameters;struct AVRational;struct AVFrame;enum XLogLevel{ XLOG_TYPE_DEBUG, XLOG_TYPE_INFO, XLOG_TYPE_ERROR, XLOG_TYPE_FATAL};#define LOG_MI ...