FFMPEG在VC中的应用

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

FFMPEG在VC中的应用

一、解码显示过程

1、注册所用编码器或者解码器

av_register_all();

2、打开视频文件

AVFormatContext *pFormatCtx;//AVFormatContext 即format I/O context,比较重要,里面记录了流文件相关信息,基本贯穿整个处理流程

// Open video file

if(av_open_input_file(&pFormatCtx, argv[1], NULL, 0, NULL)!=0)

return -1; // Couldn't open file

dump_format(pFormatCtx, 0,argv[1], 0);//用于调试,可以输出一些相关信息的

3、获取流的一些信息,比如说解码时需要的height及width

if(av_find_stream_info(pFormatCtx)<0)

return -1; // Couldn't find stream information

4、找到视频流

AVCodecContext *pCodecCtx;//AVCodecContext即Codec的相关信息

// Find the first video stream

int videoStream=-1;

for(int i=0; inb_streams; i++)

{

if(pFormatCtx->streams[i]->codec->codec_type==CODEC_TYPE_VIDEO) {

videoStream=i;

break;

}

}

if(videoStream==-1)

return -1; // Didn't find a video stream

// Get a pointer to the codec context for the video stream

pCodecCtx=pFormatCtx->streams[videoStream]->codec;

5、为对应的视频流找到编解码器

// Find the decoder for the video stream

AVCodec *pCodec;//编解码器信息

pCodec = NULL;

pCodec=avcodec_find_decoder(pCodecCtx->codec_id); if(pCodec==NULL) {

fprintf(stderr, "Unsupported codec!\n");

return -1; // Codec not found

}

6、为对应的流打开所需要的编码器

// Open codec

if(avcodec_open(pCodecCtx, pCodec)<0)

return -1; // Could not open code

7、解码

-----分配一个AVFrame的结构,用于记录原始图像信息AVFrame *pFrame;

pFrame = NULL;

pFrame = avcodec_alloc_frame();

if(pFrame==NULL)

return -1;

-----根据图像大小创建一个缓冲区

uint8_t *buffer;

int numBytes;

// Determine required buffer size and allocate buffer

numBytes=avpicture_get_size(PIX_FMT_YUV420P, pCodecCtx->width, pCodecCtx->height);

buffer=(uint8_t *)av_malloc(numBytes*sizeof(uint8_t));

avpicture_fill((AVPicture *)pFrame, buffer, PIX_FMT_RGB24,

pCodecCtx->width, pCodecCtx->height);//填充AVPicture对应域

-------解码

int frameFinished;

AVPacket packet;

i=0;

while(av_read_frame(pFormatCtx, &packet)>=0) {

// Is this a packet from the video stream?

if(packet.stream_index==videoStream) {

// Decode video frame

avcodec_decode_video(pCodecCtx, pFrame, &frameFinished,

packet.data, packet.size);

// Did we get a video frame?

if(frameFinished) {

显示视频。。。。。。

}

}

// Free the packet that was allocated by av_read_frame

}

-------释放资源

av_free_packet(&packet);

av_free(buffer);

av_free(pFrame);

// Close the codec

avcodec_close(pCodecCtx);

// Close the video file

av_close_input_file(pFormatCtx);

-------显示视频

1)加入SDL动态库

1)下载SDL开发包SDL-devel-1.2.14-VC6.zip,并解压主要生成include、lib文件

相关文档
最新文档