对于视频文件和rtsp之类的主流视频传输协议,ffmpeg提供avformat_open_input接口,直接将文件路径或URL传入即可打开。读取视频数据、解码器初始参数设置等,都可以通过调用API来完成。但是对于h264流,没有任何封装格式,也就无法使用libavformat。所以许多工作需要自己手工完成。这里的h264流指AnnexB,也就是每个nal unit以起始码00 00 00 01 或 00 00 01开始的格式。
初始化ffmpeg
- (BOOL)initFFmpegDecoder
{
/*注册所有的编码器,解析器,码流过滤器,只需要初始化一次*/
static dispatch_once_t once;
dispatch_once(&once, ^{
avcodec_register_all();
});
/*查找指定格式的解析器,这里我们使用H264*/
AVCodec *pCodec = avcodec_find_decoder(CODEC_ID_H264);
if (pCodec == NULL) {
NSLog(@"codec not found");
return NO;
}
/*初始化解析器容器*/
if (pCodecCtx == NULL) {
pCodecCtx = avcodec_alloc_context3(pCodec);
if (pCodecCtx == NULL) {
NSLog(@"Allocate codec context failed");
return