FFmpeg使用

ios配置FFmepg环境

AVFormatContext    *XYQFormatCtx;  //数据流

AVCodecContext      *XYQCodecCtx;//视频流的编解码上下文的指针

AVFrame            *XYQFrame;//用于存储解码后的音频或者视频数据

AVStream            *stream;//视频流

AVPacket            packet;//用于存储压缩的数据,分别包括有音频压缩数据,对于视频压缩数据,一个AVPacket通常包括一个视频帧。对于音频压缩数据,可能包括几个压缩的音频帧

 AVPicture          picture;//图片数据存储结构体

  int                videoStream;//视频流的索引

1.初始化

//解码器

 AVCodec*pCodec;

 // 注册所有解码器

    avcodec_register_all();

    av_register_all();

    avformat_network_init();

  // 打开视频文件

    if(avformat_open_input(&XYQFormatCtx, filePath,NULL,NULL) !=0) {

        NSLog(@"打开文件失败");

        gotoinitError;

    }

 // 检查数据流

    if (avformat_find_stream_info(XYQFormatCtx, NULL) < 0) {

        NSLog(@"检查数据流失败");

        goto initError;

    }

  // 根据数据流,找到视频流

    if((videoStream=  av_find_best_stream(XYQFormatCtx,AVMEDIA_TYPE_VIDEO, -1, -1, &pCodec,0)) <0) {

        NSLog(@"没有找到视频流");

        goto initError;

    }

    // 获取视频流的编解码上下文的指针

    stream      =XYQFormatCtx->streams[videoStream];

    XYQCodecCtx  =stream->codec;

 // 查找解码器

    pCodec =avcodec_find_decoder(XYQCodecCtx->codec_id);

    if(pCodec ==NULL) {

        NSLog(@"没有找到解码器");

        goto initError;

    }

 // 打开解码器

    if(avcodec_open2(XYQCodecCtx, pCodec,NULL) <0) {

        NSLog(@"打开解码器失败");

        goto initError;

    }

 // 分配视频帧

    XYQFrame = av_frame_alloc();

    _outputWidth = XYQCodecCtx->width;

    _outputHeight = XYQCodecCtx->height;

2.读取一帧视频

 if (packet.stream_index == videoStream) {

            //解码

            avcodec_decode_video2(XYQCodecCtx,

                                  XYQFrame,

                                  &frameFinished,

                                  &packet);

        }

3.将读取的视频帧转化为图片即可

你可能感兴趣的:(FFmpeg使用)