ffmpeg+qt尝试1
#include <iostream>
#include <opencv2/highgui.hpp>
#include <QException>
extern "C"
{
#include "libavformat/avformat.h"
#include "libavutil/time.h"
#include "libavcodec/avcodec.h"
#include "libswscale/swscale.h"
}
#pragma comment(lib,"opencv_world320.lib")
#pragma comment(lib,"avformat.lib")
#pragma comment(lib,"avutil.lib")
#pragma comment(lib,"avcodec.lib")
#pragma comment(lib,"swscale.lib")
using namespace std;
using namespace cv;
int main()
{
char* inurl="C:/Users/hhhheyijia/Desktop/a.mp4";
char* outurl="rtmp://139.224.104.177/live";
avcodec_register_all();
avformat_network_init();
VideoCapture cam;
Mat frame;
SwsContext* sws=NULL;
AVFrame *yuv=NULL;
AVCodecContext* vc=NULL;
AVFormatContext* oct=NULL;
try
{
cam.open(inurl);
int inWidth=cam.get(CAP_PROP_FRAME_WIDTH);
int inHeight=cam.get(CAP_PROP_FRAME_HEIGHT);
int fps=cam.get(CAP_PROP_FPS);
sws=sws_getCachedContext(sws,
inWidth,inHeight,AV_PIX_FMT_BGR24,
inWidth,inHeight,AV_PIX_FMT_YUV420P,
SWS_BICUBIC,
0,0,0);
yuv=av_frame_alloc();
yuv->width=inWidth;
yuv->height=inHeight;
yuv->format=AV_PIX_FMT_YUV420P;
yuv->pts=0;
int ret=av_frame_get_buffer(yuv,32);
if(ret<0)
{
char buf[1024]={0};
av_strerror(ret,buf,sizeof(buf)-1);
}
AVCodec* codec=avcodec_find_encoder(AV_CODEC_ID_H264);
vc=avcodec_alloc_context3(codec);
vc->flags|=AV_CODEC_FLAG_GLOBAL_HEADER;
vc->codec_id=codec->id;
vc->thread_count=4;
vc->pix_fmt=AV_PIX_FMT_YUV420P;
vc->bit_rate=100*1024*8;
vc->time_base={1,fps};
vc->framerate={fps,1};
vc->width=inWidth;
vc->height=inHeight;
vc->gop_size=50;
vc->max_b_frames=10;
ret=avcodec_open2(vc,codec,NULL);
if(ret<0)
{
char buf[1024]={0};
av_strerror(ret,buf,sizeof(buf)-1);
}
ret=avformat_alloc_output_context2(&oct,0,"flv",outurl);
if(!oct)
{
char buf[1024]={0};
av_strerror(ret,buf,sizeof(buf)-1);
}
AVStream* vs=avformat_new_stream(oct,NULL);
vs->codec->codec_tag=0;
avcodec_parameters_from_context(vs->codecpar,vc);
av_dump_format(oct,0,outurl,1);
ret=avio_open(&oct->pb,outurl,AVIO_FLAG_READ_WRITE);
if(ret!=0)
{
char buf[1024]={0};
av_strerror(ret,buf,sizeof(buf)-1);
}
ret=avformat_write_header(oct,NULL);
if(ret<0)
{
char buf[1024]={0};
av_strerror(ret,buf,sizeof(buf)-1);
}
AVPacket pack;
memset(&pack,0,sizeof(pack));
int vpts=0;
for(;;)
{
if(!cam.grab())
{
continue;
}
if(!cam.retrieve(frame))
{
continue;
}
uint8_t* indata[AV_NUM_DATA_POINTERS]={0};
indata[0]=frame.data;
int linesize[AV_NUM_DATA_POINTERS]={0};
linesize[0]=frame.elemSize()*frame.cols;
int h=sws_scale(sws,indata,linesize,0,inHeight,
yuv->data,yuv->linesize);
yuv->pts=vpts;
vpts++;
ret=avcodec_send_frame(vc,yuv);
if(ret!=0)
continue;
ret=avcodec_receive_packet(vc,&pack);
if(ret!=0)
continue;
pack.pts=av_rescale_q(pack.pts,vc->time_base,vs->time_base);
pack.dts=av_rescale_q(pack.dts,vc->time_base,vs->time_base);
pack.duration=av_rescale_q(pack.duration,vc->time_base,vs->time_base);
ret=av_interleaved_write_frame(oct,&pack);
if(ret==0)
{
cout<<"#"<<flush;
}
}
}
catch(exception& ex)
{
if(cam.isOpened())
cam.release();
if(sws)
{
sws_freeContext(sws);
sws=NULL;
}
if(vc)
{
avcodec_close(vc);
avcodec_free_context(&vc);
}
cerr<<ex.what()<<endl;
}
getchar();
return 0;
}