//#include "decodethread.h"
//#include <QDebug>
//DecodeThread::DecodeThread(AVPacketQueue *packet_queue, AVFrameQueue *frame_queue)
// :packet_queue_(packet_queue),frame_queue_(frame_queue)
//{
//}
//DecodeThread::~DecodeThread()
//{
// if(thread_)
// {
// Stop();
// }
// if(codec_ctx_)
// {
// avcodec_close(codec_ctx_);
// }
// if(sws_ctx_)
// {
// sws_freeContext(sws_ctx_);
// }
//}
//int DecodeThread::Init(AVCodecParameters *par)
//{
// if(!par)
// {
// qDebug("Init par is null!");
// return -1;
// }
// codec_ctx_ = avcodec_alloc_context3(NULL);
// int ret = avcodec_parameters_to_context(codec_ctx_, par);
// if(ret<0)
// {
// av_strerror(ret, err2str, sizeof (err2str));
// qDebug("avcodec_parameters_to_context failed, ret:%d,err2str:%s \n", ret, err2str);
// return -1;
// }
// const AVCodec *codec = avcodec_find_decoder(codec_ctx_->codec_id);
// if(!codec)
// {
// qDebug("avcodec_find_decoder failed");
// return -1;
// }
// ret = avcodec_open2(codec_ctx_,codec,NULL);
// if(ret <0)
// {
// av_strerror(ret, err2str, sizeof (err2str));
// qDebug("avcodec_open2 failed, ret:%d,err2str:%s \n", ret, err2str);
// return -1;
// }
// // 初始化 SwsContext,将 MJPEG 格式转换为 YUV420P
// sws_ctx_ = sws_getContext(
// codec_ctx_->width, codec_ctx_->height, codec_ctx_->pix_fmt, // 源格式
// codec_ctx_->width, codec_ctx_->height, AV_PIX_FMT_YUV420P, // 目标格式
// SWS_BILINEAR, NULL, NULL, NULL);
// if(!sws_ctx_)
// {
// qDebug("sws_getContext failed");
// return -1;
// }
// qDebug("Init finish!");
// return 0;
//}
//int DecodeThread::Start()
//{
// thread_ = new std::thread(&DecodeThread::Run, this);
// if(!thread_){
// qDebug("new std::thread(&DecodeThread::Run, this) failed");
// return -1;
// }
// return 0;
//}
//int DecodeThread::Stop()
//{
// Thread::Stop();
//}
//void DecodeThread::Run()
//{
// AVFrame *frame = av_frame_alloc();
// AVFrame *yuv_frame = av_frame_alloc();
// // 分配YUV420P格式的AVFrame
// yuv_frame->format = AV_PIX_FMT_YUV420P;
// yuv_frame->width = codec_ctx_->width;
// yuv_frame->height = codec_ctx_->height;
// if(av_frame_get_buffer(yuv_frame, 32)<0)
// {
// qDebug()<<"could not allocate buffer for yuv_frame";
// return;
// }
// if(!yuv_frame->data[0])
// {
// qDebug()<<"yuv_frame->date[0] is nullptr after av_frame_get_buffer";
// return;
// }
// qDebug("DecodeThread::Run into DecodeThread::run");
// while(abort_ !=1)
// {
// if(frame_queue_->Size()>10)
// {
// std::this_thread::sleep_for(std::chrono::milliseconds(10));
// continue;
// }
// AVPacket *pkt = packet_queue_->Pop(10);
// if(pkt)
// {
// int ret = avcodec_send_packet(codec_ctx_, pkt);
// av_packet_free(&pkt);
// qDebug("ret=%d", ret);
// if(ret <0)
// {
// av_strerror(ret, err2str, sizeof (err2str));
// qDebug("avcodec_send_packet failed, ret:%d,err2str:%s \n", ret, err2str);
// break;
// }
// //读解码后的frame
// while(true)
// {
// ret = avcodec_receive_frame(codec_ctx_, frame);
// if(ret == 0)
// {
// // 使用sws_scale将frame从MJPEG转换为YUV420P格式
// ret = sws_scale(sws_ctx_,
// frame->data, frame->linesize, 0, codec_ctx_->height,
// yuv_frame->data, yuv_frame->linesize);
// if(ret<0)
// {
// qDebug("sws_scale failed, ret:%d", ret);
// continue;
// }
// // 将转换后的YUV420P格式的帧推入frame_queue_
// frame_queue_->Push(yuv_frame);
// qDebug("%s frame queue size%d", codec_ctx_->codec->name, frame_queue_->Size());
// continue;
// }else if(AVERROR(EAGAIN)==ret)
// {
// break;
// }else
// {
// abort_ = 1;
// av_strerror(ret, err2str, sizeof (err2str));
// qDebug("avcodec_receive_frame failed, ret:%d,err2str:%s \n", ret, err2str);
// break;
// }
// }
// }else
// {
// qDebug("not got packet");
// }
// }
// av_frame_free(&frame);
// qDebug("DecodeThread::Run finish");
//}
#include "decodethread.h"
#include <QDebug>
DecodeThread::DecodeThread(AVPacketQueue *packet_queue, AVFrameQueue *frame_queue)
: packet_queue_(packet_queue), frame_queue_(frame_queue)
{
}
DecodeThread::~DecodeThread()
{
if (thread_)
{
Stop();
}
if (codec_ctx_)
{
avcodec_close(codec_ctx_);
}
if (sws_ctx_)
{
sws_freeContext(sws_ctx_);
}
}
int DecodeThread::Init(AVCodecParameters *par)
{
if (!par)
{
qDebug("Init par is null!");
return -1;
}
codec_ctx_ = avcodec_alloc_context3(NULL);
int ret = avcodec_parameters_to_context(codec_ctx_, par);
if (ret < 0)
{
av_strerror(ret, err2str, sizeof(err2str));
qDebug("avcodec_parameters_to_context failed, ret:%d, err2str:%s", ret, err2str);
return -1;
}
const AVCodec *codec = avcodec_find_decoder(codec_ctx_->codec_id);
if (!codec)
{
qDebug("avcodec_find_decoder failed");
return -1;
}
ret = avcodec_open2(codec_ctx_, codec, NULL);
if (ret < 0)
{
av_strerror(ret, err2str, sizeof(err2str));
qDebug("avcodec_open2 failed, ret:%d, err2str:%s", ret, err2str);
return -1;
}
// 初始化 SwsContext,将 MJPEG 格式转换为 YUV420P
sws_ctx_ = sws_getContext(
codec_ctx_->width, codec_ctx_->height, codec_ctx_->pix_fmt, // 源格式
codec_ctx_->width, codec_ctx_->height, AV_PIX_FMT_YUV420P, // 目标格式
SWS_BILINEAR, NULL, NULL, NULL);
if (!sws_ctx_)
{
qDebug("sws_getContext failed");
return -1;
}
qDebug("Init finish!");
return 0;
}
int DecodeThread::Start()
{
thread_ = new std::thread(&DecodeThread::Run, this);
if (!thread_)
{
qDebug("new std::thread(&DecodeThread::Run, this) failed");
return -1;
}
return 0;
}
int DecodeThread::Stop()
{
Thread::Stop();
}
void DecodeThread::Run()
{
AVFrame *frame = av_frame_alloc();
qDebug("DecodeThread::Run into DecodeThread::run");
while (abort_ != 1)
{
AVFrame *yuv_frame = av_frame_alloc();
// 分配YUV420P格式的AVFrame
yuv_frame->format = AV_PIX_FMT_YUV420P;
yuv_frame->width = codec_ctx_->width;
yuv_frame->height = codec_ctx_->height;
if (av_frame_get_buffer(yuv_frame, 32) < 0)
{
qDebug() << "Could not allocate buffer for yuv_frame";
return;
}
if (!yuv_frame->data[0])
{
qDebug() << "yuv_frame->data[0] is nullptr after av_frame_get_buffer";
return;
}
if (frame_queue_->Size() > 10)
{
std::this_thread::sleep_for(std::chrono::milliseconds(10));
c
没有合适的资源?快使用搜索试试~ 我知道了~
树莓派4B开发板上,通过Qt+FFMPEG以多线程分别解码、编码USB摄像头视频数据
共16个文件
h:7个
cpp:7个
user:1个
需积分: 5 0 下载量 200 浏览量
2024-11-13
16:04:40
上传
评论
收藏 15KB ZIP 举报
温馨提示
本项目为在树莓派4B开发板上,通过Qt+FFMPEG以多线程分别解码、编码USB摄像头视频数据。其中USB摄像头视频输入格式为MJPEG。通过树莓派的硬件编码器“h264_omx”进行硬件编码封装成mp4文件。详细说明见https://blog.csdn.net/wang_chao118/article/details/143743277?sharetype=blogdetail&sharerId=143743277&sharerefer=PC&sharesource=wang_chao118&spm=1011.2480.3001.8118
资源推荐
资源详情
资源评论
收起资源包目录
5-project-1113-can-run.zip (16个子文件)
5-project
queue.h 2KB
decodethread.h 732B
thread.h 497B
encodethread.h 1KB
demuxthread.cpp 3KB
demuxthread.h 827B
5-project.pro.user 23KB
avframequeue.h 511B
avpacketqueue.cpp 974B
main.cpp 2KB
thread.cpp 49B
avpacketqueue.h 506B
5-project.pro 1KB
avframequeue.cpp 1KB
encodethread.cpp 6KB
decodethread.cpp 11KB
共 16 条
- 1
资源评论
wang_chao118
- 粉丝: 1789
- 资源: 20
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功