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= ...
ffmpeg
基础配置
头文件 include
库文件 lib lib/x86 x64
动态库文件 dll bin/x86 x64
调式执行和pdb路径 bin/x86 x64
源码项目路径 src/first_ffmpeg
ffmpeg源码 tools
将文件配置进入项目中
(以Visual Studio 2017为例)
YUV格式
YUV444
表示$4:4:4$的YUV取样。
每个像素都有独立的Y、U、V分量。
每一个像素Y占一个字节,U占一个字节,V占一个字节,因此每个像素占:
$$1 (Y)×8 bits+1 (U)×8 bits+1 (V)×8 bits=24 bits/pixel (bpp)$$
以$2\times 2$的图像为例
1234像素1:Y1, U1, V1像素2:Y2, U2, V2像素3:Y3, U3, V3像素4:Y4, U4, V4
YUV422
表示$4:2:2$的YUV取样。
每相邻两个像素每个像素占一个Y,共享一个U和一个V,因此两个像素占:
$$2 (Y)×8 bits+1 (U)×8 bits+1 (V)×8 bits=32 bits$$
每个 ...
Qt
第一章:认识Qt
如何添加第三方库
Qt Creater在pro文件下进行添加
Vs2019在右键属性Qt设置里添加
QMake与CMake
qmake:qt独有的代码构建工具
cmake:C++通用的代码构建工具,绝大部分C++开源项目都是使用cmake管理代码,如obs,jsoncpp
总结:
如果你主要在开发Qt应用程序,尤其是当你不需要复杂的自定义构建逻辑时,QMake可能是更简单直接的选择。
如果你的项目需要跨平台支持,或者你需要一种更灵活、功能更强大的构建系统,CMake可能是更好的选择。
Qt的三个窗口
QMainWindow:是Qt提供的一个主窗口类,它为应用程序提供了一个带有菜单栏、工具栏、状态栏、和可选的停靠窗口(dock widgets)和中心窗口的主窗口。适合做应用程序的主界面。
QWidget:是所有用户界面对象的基类。它可以作为一个独立的窗口或者是其他窗口(如QMainWindow、QDialog)中的一个组件使用。它通常被用来创建应用程序中的简单窗口或作为组合较复杂控件的基础。
QDialog:是用于创建对话框的基类。通常用于短暂的交互,如收集用 ...
AcWing Web课
html基础标签
有疑问查询MDN:https://developer.mozilla.org/zh-CN/
html文件结构
文档结构
html的所有标签为树形结构,例如:
1234567891011<!DOCTYPE html><html lang="zh-CN"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Web应用课</title></head><body> <h1>第一讲</h1></body></html>
<html></html>:类似于根节点。
<body></body>、<title> ...