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:是用于创建对话框的基类。通常用于短暂的交互,如收集用 ...
XDemuxTask
XDemuxTask.h
1234567891011121314151617181920212223242526272829303132#pragma once#include "xtools.h"#include "xdemux.h"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(); } std::shared_ptr<XPara> CopyAudioPara() { return demux_.CopyAudioPara(); }private: XD ...
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 ...
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
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172#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 { ...