ffmpeg中获取yuv解码后数据

void FfmpegMuxer::flushVideoQueue(uint64_t startTimestamp){
FrameNode videoNode;
Log::write("flush Video queue , startTimeStamp = %d\n", startTimestamp);
if(demuxer->beChunkMode2()) {
return;
}
while(demuxer->getVideoFrame(videoNode, startTimestamp)){
//if(demuxer->getVideoFrame(videoNode, startTimestamp)){
//decode video frame.
//fprintf(demuxer->fp4showsquence, "Video: timestamp = %d\n", videoNode.startStamp);
AVPacket packet;
packet.data = videoNode.buffer;
packet.size = videoNode.len;
int pts = videoNode.pts;
//int timeStamp = videoNode.startStamp;
AVFrame *pFrame = NULL;
pFrame=avcodec_alloc_frame();


int frameFinished = 0;


int ret = 0;


AVCodecContext *pCodecCtx = demuxer->getCodecContext();
int width,height;
demuxer->getVideoFrameWH(width, height);

ret = avcodec_decode_video2(pCodecCtx, pFrame, &frameFinished,
                         &packet);


free(videoNode.buffer);

if(ret < 0){
Log::write("error: avcodec_decode_video() failed.\n");
if(pFrame){
av_free(pFrame);
}
continue;
}


if(frameFinished == 0){
Log::write("error: need next frame to finish decode.\n");
if(pFrame){
av_free(pFrame);
}
continue;
}

generatePreview(pFrame, width, height);


if(pFrame){
av_free(pFrame);
}
//writeVideoFrame(outContext, videoStream, yuvdata);
writeVideoFrame2(outContext, videoStream, yuvdata, pts);
}
}



void FfmpegMuxer::generatePreview(AVFrame* pFrame, int width, int height)

{
memset(yuvdata, 0, 1024 * 1024);
int hw = (width+1)/2;
int hh = (height+1)/2;
for (int y = 0; y < height; y++)
memcpy(&yuvdata[width*y], &pFrame->data[0][pFrame->linesize[0]*y], width);
for (int y = 0; y < hh; y++) {
memcpy(&yuvdata[width*height + hw*y], &pFrame->data[1][pFrame->linesize[1]*y], hw);
memcpy(&yuvdata[width*height + hw*hh + hw*y], &pFrame->data[2][pFrame->linesize[2]*y], hw);
}
if(!hasPreview){
addPreview(yuvdata, width, height);
}

}



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值