诗词
字典
板报
句子
名言
励志
学校
友答
搜索
首页
中考频道
作文频道
公务员频道
出国留学
医药考试
司法考试
图书频道
外语考试
建筑工程
成人高考
故事频道
教程频道
文档频道
早教
星座频道
校园
求职招聘
考研频道
职业资格
自考频道
计算机考试
财会考试
高考频道
当前位置:
首页
>
教程频道
>
其他教程
>
其他相关
>
FFmpeg - 视频解码历程
2012-08-02
FFmpeg - 视频解码过程FFmpeg的文档做得不好,导致学会使用这个库是存在一定难度的。在对文件进行解码时,抄
FFmpeg - 视频解码过程
FFmpeg的文档做得不好,导致学会使用这个库是存在一定难度的。在对文件进行解码时,抄网上流传的例子就可以了。比如,常见的例子是这样的:
// 解析PES得到ES TS_PesDecoder pesdec; pesdec.Parse(m_iDemux.Payload(), m_iDemux.PayloadSize()); // AVPacket应包含的是ES数据 AVPacket avpkt; av_init_packet(&avpkt); avpkt.size = pesdec.m_nEsLength; avpkt.data = pesdec.m_pEs; if (avpkt.size == 0) return -1 ; // 解AVPacket,得到图像数据AVFrame while (avpkt.size > 0) { int got_picture = 0; int len = avcodec_decode_video2(m_pCodecContext, m_pPicture, &got_picture, &avpkt); if (len < 0) { fprintf(stderr, "Error while decoding frame...\n"); break; } if (got_picture) { int width = m_pCodecContext->width; int height = m_pCodecContext->height; VideoFrame frame; frame.nWidth = width; frame.nHeight = height; frame.nPts = pesdec.m_nPts / 45; // in ms AVPicture& pic_rgb = frame.iPic; avpicture_alloc(&pic_rgb, PIX_FMT_RGB24, width, height); // 用swscale库把YUYV420P转成RGB24 SwsContext* img_convert_ctx = sws_getContext(width, height, PIX_FMT_YUV420P, width, height, PIX_FMT_RGB24, SWS_BICUBIC, NULL, NULL, NULL); sws_scale(img_convert_ctx, m_pPicture->data, m_pPicture->linesize, 0, height, pic_rgb.data, pic_rgb.linesize); sws_freeContext(img_convert_ctx); printf("Saving a frame ....\n"); m_iMutex.Lock(); m_lstFrames.push_back(frame); m_iMutex.Unlock(); return 1; } avpkt.size -= len; avpkt.data += len; }