Qt+ffmpeg解码视频
http://www.oschina.net/code/snippet_1466652_44272
1. [文件] main.cpp ~ 176B 下载(0)
1
2
3
4
5
6
7
8
9
10
11
|
#include
"video.h"
#include <QApplication>
int
main(
int
argc,
char
*argv[])
{
QApplication a(argc, argv);
Video w;
w.show();
return
a.exec();
}
|
2. [文件] video.h ~ 597B 下载(0)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
#ifndef VIDEO_H
#define VIDEO_H
#include <QThread>
#include <QWidget>
#include <QDebug>
#include <QImage>
#include <QPixmap>
#include "videodec.h"
class
VideoDec;
namespace
Ui {
class
Video;
}
class
Video :
public
QWidget
{
Q_OBJECT
public
:
explicit
Video(QWidget *parent = 0);
~Video();
QThread *VideoDecThread;
VideoDec *OVideoDec;
signals:
void
init_s();
void
play_s();
public
slots:
void
showVideo(
const
QImage &img);
private
slots:
void
on_VideoPlay_clicked();
private
:
Ui::Video *ui;
};
#endif // VIDEO_H
|
3. [文件] video.cpp ~ 888B 下载(0)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
#include
"video.h"
#include "ui_video.h"
Video::Video(QWidget *parent) :
QWidget(parent),
ui(
new
Ui::Video)
{
ui->setupUi(
this
);
VideoDecThread =
new
QThread(
this
);
OVideoDec =
new
VideoDec;
OVideoDec->moveToThread(VideoDecThread);
VideoDecThread->start();
connect(
this
,SIGNAL(init_s()),OVideoDec,SLOT(init()));
connect(
this
,SIGNAL(play_s()),OVideoDec,SLOT(play()));
//connect(OVideoDec,SIGNAL(SendImage(QImage)),this,SLOT(showVideo(QImage)));
connect(OVideoDec,SIGNAL(SendImage(QImage)),
this
,SLOT(showVideo(QImage)));
}
Video::~Video()
{
delete
ui;
}
void
Video::on_VideoPlay_clicked()
{
emit init_s();
//emit play_s();
}
void
Video::showVideo(
const
QImage &img)
{
QPixmap pix;
pix = pix.fromImage(img).scaledToWidth(ui->VideoShow->width());
ui->VideoShow->setPixmap(pix);
}
|
4. [文件] videodec.h ~ 790B 下载(0)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
#ifndef VIDEODEC_H
#define VIDEODEC_H
extern
"C"
{
#include "libavcodec/avcodec.h"
#include "libavformat/avformat.h"
#include "libavutil/avutil.h"
#include "libavutil/mem.h"
#include "libavutil/fifo.h"
#include "libswscale/swscale.h"
}
#include <QObject>
#include <QImage>
#include <QThread>
#include <QDebug>
class
VideoDec :
public
QObject
{
Q_OBJECT
public
:
explicit
VideoDec(QObject *parent = 0);
int
videoindex;
AVFormatContext *pFormatCtx;
AVCodecContext *pCodecCtx;
AVCodec *pCodec;
AVPacket *packet;
AVFrame *pFrame,*pFrameRGB;
char
*FileName =
"E:/mv/1.mp4"
;
signals:
void
SendImage(QImage img);
public
slots:
void
init();
void
play();
};
#endif // VIDEODEC_H
|
5. [文件] videodec.cpp ~ 2KB 下载(0)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
|
#include
"videodec.h"
VideoDec::VideoDec(QObject *parent) :
QObject(parent)
{
}
void
VideoDec::init()
{
qDebug()<<
"init"
;
avcodec_register_all();
av_register_all();
pFormatCtx = avformat_alloc_context();
if
(avformat_open_input(&pFormatCtx,FileName,NULL,NULL)!=0){
qDebug()<<
"OpenFail"
;
}
if
(avformat_find_stream_info(pFormatCtx,NULL)<0){
qDebug()<<
"FindFail"
;
}
videoindex = -1;
for
(
int
i=0;pFormatCtx->nb_streams;i++){
if
(pFormatCtx->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO){
videoindex = i;
break
;
}
}
if
(videoindex == -1){
qDebug()<<
"Din't find video stream"
;
}
pCodecCtx = pFormatCtx->streams[videoindex]->codec;
pCodec = avcodec_find_decoder(pCodecCtx->codec_id);
if
(pCodec == NULL){
qDebug()<<
"codec not find"
;
}
if
(avcodec_open2(pCodecCtx,pCodec,NULL)<0){
qDebug()<<
"can't open codec"
;
}
pFrame = avcodec_alloc_frame();
pFrameRGB = avcodec_alloc_frame();
play();
}
void
VideoDec::play()
{
int
got_picture;
int
y_size = pCodecCtx->width*pCodecCtx->height;
packet=(AVPacket *)
malloc
(
sizeof
(AVPacket));
av_new_packet(packet, y_size);
uint8_t *out_buffer;
out_buffer =
new
uint8_t[avpicture_get_size(PIX_FMT_RGB32, pCodecCtx->width, pCodecCtx->height)];
//分配AVFrame所需内存
avpicture_fill((AVPicture *)pFrameRGB, out_buffer, PIX_FMT_RGB32, pCodecCtx->width, pCodecCtx->height);
//填充AVFrame
while
(av_read_frame(pFormatCtx,packet)>=0){
if
(packet->stream_index == videoindex){
int
rec = avcodec_decode_video2(pCodecCtx,pFrame,&got_picture,packet);
if
(rec>0){
SwsContext *convertCtx = sws_getContext(pCodecCtx->width,pCodecCtx->height
,pCodecCtx->pix_fmt,pCodecCtx->width,pCodecCtx->height
,PIX_FMT_RGB32,SWS_BICUBIC,NULL,NULL,NULL);
sws_scale(convertCtx,(
const
uint8_t*
const
*)pFrame->data,pFrame->linesize,0
,pCodecCtx->height,pFrameRGB->data,pFrameRGB->linesize);
QImage Img((uchar *)pFrameRGB->data[0],pCodecCtx->width,pCodecCtx->height,QImage::Format_RGB32);
emit SendImage(Img);
}
}
av_free_packet(packet);
QThread::msleep(4);
}
}
|