5 Star 22 Fork 7

zhouws-chn/ZPlay_VideoPlayer

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
zffvideo.cpp 3.39 KB
一键复制 编辑 原始数据 按行查看 历史
#include "zffvideo.h"
#include "zffmpeg.h"
#include "zffaudio.h"
#include <QDebug>
QAtomicPointer<ZFFvideo> ZFFvideo::_instance = 0;
QMutex ZFFvideo::_mutex;
ZFFvideo::ZFFvideo()
{}
ZFFvideo * ZFFvideo::getInstance()
{
// 使用双重检测。
/*! testAndSetOrders操作保证在原子操作前和后的的内存访问
* 不会被重新排序。
*/
if (_instance.testAndSetOrdered(0, 0)) // 第一次检测
{
QMutexLocker locker(&_mutex); // 加互斥锁。
_instance.testAndSetOrdered(0, new ZFFvideo); // 第二次检测。
}
return _instance;
}
int ZFFvideo::ToRGB(const AVFrame *yuv, char *out, int outwidth, int outheight)
{
AVFormatContext *ic = ZFFmpeg::getInstance()->GetFormatCtx();
int videoStream = ZFFmpeg::getInstance()->GetVideoStream();
// QMutexLocker locker(&_mutex);//加互斥锁
if (!ic) // 未打开视频文件
{
return -1;
}
AVCodecContext *videoCtx = ic->streams[videoStream]->codec;
SwsContext *cCtx = NULL;
cCtx = sws_getCachedContext(cCtx, videoCtx->width, // 初始化一个SwsContext
videoCtx->height,
videoCtx->pix_fmt, // 输入像素格式
outwidth, outheight,
AV_PIX_FMT_BGRA, // 输出像素格式
SWS_BICUBIC, // 转码的算法
NULL, NULL, NULL);
if (!cCtx)
{
qDebug("sws_getCachedContext failed!");
return -1;
}
uint8_t *data[AV_NUM_DATA_POINTERS] = { 0 };
data[0] = (uint8_t *)out;
int linesize[AV_NUM_DATA_POINTERS] = { 0 };
linesize[0] = outwidth * 4; // 一行的宽度,32位4个字节
int h = sws_scale(cCtx, yuv->data, // 当前处理区域的每个通道数据指针
yuv->linesize, // 每个通道行字节数
0, videoCtx->height, // 原视频帧的高度
data, // 输出的每个通道数据指针
linesize // 每个通道行字节数
); // 开始转码
return 0;
}
void ZFFvideo::terminate() {
_canBeRun = false;
}
void ZFFvideo::start(Priority pro) {
_canBeRun = true;
QThread::start(pro);
qDebug("ZFFvideo::start");
}
void ZFFvideo::run() {
while (_canBeRun) {
// qDebug("%d",ZFFmpeg::getInstance()->videoList.size());
if (ZFFmpeg::getInstance()->videoList.list.size() > 0) {
AVPacket pkt;
{
QMutexLocker locker(&ZFFmpeg::getInstance()->videoList._mutex);
pkt = ZFFmpeg::getInstance()->videoList.list.takeFirst();
curTimestampSec = ZFFmpeg::getInstance()->GetPts(&pkt);
// qDebug("ZFFvideo::run play %f ms", curTimestampSec);
}
while (_canBeRun &&
curTimestampSec > ZFFaudio::getInstance()->GetCurTimeSec()) {
msleep(1);
}
AVFrame *videoFrame = ZFFmpeg::getInstance()->Decode(&pkt); // 解码
av_packet_unref(&pkt); // 释放pkt包
RGBList.append(videoFrame);
} else {
msleep(1);
}
}
}
void ZFFvideo::stop() {
_canBeRun = false;
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
C++
1
https://gitee.com/zhouws-chn/ZPlay_VideoPlayer.git
[email protected]:zhouws-chn/ZPlay_VideoPlayer.git
zhouws-chn
ZPlay_VideoPlayer
ZPlay_VideoPlayer
master

搜索帮助