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.将读取的视频帧转化为图片即可