欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

播放器实战23解码线程

时间:2023-04-21

对于视频线程和音频线程来说其中有很多一模一样的内容,比如用于存放pkt的队列,最大数量,解码器,push,pop等,故将他们抽象出来做为一个基类(xdecodethread),让视频线程和音频线程继承这个类,便可以使用这些共有的成员:

xdecodethread.h

class xdecodethread :public QThread{public:xdecodethread();virtual ~xdecodethread();virtual void push(AVPacket* pkt);virtual void Clear();virtual AVPacket* pop();int maxList = 10000;bool isexit = false;protected:std::list packs;std::mutex mux;xdecode* decode = 0;};

xdecodethread.cpp

#include "xdecodethread.h"#include"xdecode.h"#includeusing namespace std;xdecodethread::xdecodethread(){ if(!decode)xdecode* decode = new xdecode();}xdecodethread::~xdecodethread(){isexit = true;cout << "解码线程结束" <clear();while (!packs.empty()){AVPacket* pkt = packs.front();XFreePacket(&pkt);packs.pop_front();}mux.unlock();}

push:在解封装的线程中将从封装中读到pkt,如果是视频pkt则push到视频线程的队列,如果是音频pkt则push到音频线程的队列里。(push()与队列都是继承自解码线程的成员)

在clear()的最后一次循环中,pkt放的是队列里最后一个packet的数据,需要被清理,将该功能(av_packet_free)是ffmpeg库里的方法,使用该方法需要引入头文件,但是我们这里不在解码线程里将该头文件开放出去:

extern "C" {#include "libavformat/avformat.h"#include"libavcodec/avcodec.h"}#pragma comment(lib,"avformat.lib")#pragma comment(lib,"avutil.lib")#pragma comment(lib,"avcodec.lib")

但是在xdecode类中引用过该头文件,由于解码线程中引入了xdecode头文件,故再xdecode中将该功能(av_packet_free)封装成(XFreePacket),于是可以在解码线程中不引入ffmpeg的头文件便可以使用其中的功能:

void XFreePacket(AVPacket** pkt){if (pkt || (*pkt))return;av_packet_free(pkt);}

也可以通过引入ffmpeg头文件直接调用

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。