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 ...
XMux
XMux.h
继承于XFormat
作用:处理多媒体文件的封装,提供了一系列函数用于打开封装上下文、写入数据包、写入头信息和结束信息,同时处理音视频的时间基准。
12345678910111213141516171819202122232425262728293031#pragma once#include "xformat.h"class XMux : public XFormat{public: static AVFormatContext *Open(const char *url, AVCodecParameters *video_para = nullptr, AVCodecParameters *audio_para = nullptr ); bool WriteHead(); bool Write(AVPacket *pkt); bool WriteEnd(); void set_src_video_time_base(AVRational *tb); void set_src_audio_time_base(AVRation ...
XFormat
XFormat.h
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273#pragma once#include "xtools.h"#include <mutex>struct AVFormatContext;struct AVCodecParameters;struct AVPacket;struct AVCodecContext;struct XRational{ int num; int den;};class XFormat{public: bool CopyPara(int stream_index, AVCodecParameters *dst); /* 重载!! 由于 AVCodecParameters* 和 AVCodecContext* 都是指针类型, 编译器无法区分它们,因 ...
XDecode
XDecode.h
Send 函数用于向解码器发送编码数据包。
Recv 函数用于从解码器接收解码后的帧数据。
InitHW 函数用于初始化硬件加速设备。
End 函数用于获取解码器中剩余的所有帧数据。
123456789101112131415#pragma once#include "xcodec.h"struct AVBufferRef;class XDecode :public XCodec{public: bool Send(const AVPacket* pkt); bool Recv(AVFrame* frame); std::vector<AVFrame*> End(); // 初始化硬件加速 // 默认AV_HWDEVICE_TYPE_DXVA2 值为4 bool InitHW(int type = 4); };
AVHWDeviceType:int type = 4代表AV_HWDEVICE_TYPE_DXVA2
123456789101112131415enum AVHWDeviceType { ...
XEncode
XEncode.h
作用:继承于XCodec,用于编码
12345678910#pragma once#include "xcodec.h"class XEncode:public XCodec{public: AVPacket *Encode(const AVFrame* frame); std::vector<AVPacket *> End();};
AVPacket
是 FFmpeg 库中的一个数据结构,主要用于存储编码后的音频或视频数据包。
在多媒体处理中,数据包通常包含一个完整的编码帧或部分编码帧的比特流数据。
这些数据包可以用于传输、存储或进一步处理,如解码。
123456789101112131415161718typedef struct AVPacket { uint8_t *data; // 指向实际存储编码数据的缓冲区 int size; // 缓冲区中数据的大小,以字节为单位 int64_t pts; // 显示时间戳 int64_t dts; // 解码时间 ...
XCodec
XCodec
作用:编码和解码的基类
1234567891011121314151617181920212223242526272829303132#pragma once#include <mutex>#include <vector>extern "C" {#include <libavcodec/avcodec.h>#include <libavutil/avutil.h>}struct AVCodecContext;struct AVPacket;struct AVFrame;class XCodec{public: static AVCodecContext* Create(int codec_id, bool is_encode); void set_c(AVCodecContext* c); bool SetOpt(const char* key, const char* val); bool SetOpt(const char* key, int val); bool Op ...
XSDL
SDL介绍
SDL(Simple DirectMedia Layer)是一个跨平台的多媒体开发库,广泛用于游戏开发和多媒体应用的创建。它提供了对音频、键盘、鼠标、游戏控制器、图形和窗口的底层访问,从而使开发者能够编写高性能的多媒体应用程序。SDL被许多流行的游戏和软件项目所使用。
SDL的主要特点
跨平台支持: SDL支持多个操作系统,包括Windows、Mac OS、Linux、iOS和Android等,使得开发者能够编写一次代码,运行在多个平台上。
简化多媒体处理: SDL提供了对音频、视频、输入设备、计时器等多媒体功能的简化接口,使开发者不需要处理底层系统的细节。
硬件加速: SDL支持使用OpenGL、Direct3D等图形库进行硬件加速,从而提高图形渲染的性能。
模块化设计: SDL的功能被划分为多个模块,如视频、音频、事件处理、线程、文件I/O等,开发者可以按需使用。
XSDL.h
12345678910111213141516171819202122232425262728293031#pragma once#include "xvideo_view.h&q ...
XVideoView
XVideoView.h
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182#ifndef XVIDEO_VIEW_H#define XVIDEO_VIEW_H#include <mutex>#include <fstream>#include "xtools.h"struct AVFrame;class XVideoView{public: enum Format { YUV420P = 0, NV12 = 23, ARGB = 25, RGBA = 26, BGRA = 28 }; enum RenderType { SDL = 0 }; static XVideoView* Create(RenderType type= ...