音视频开发——ffmpeg解码(四)
来源:互联网 发布:淘宝怎么设置限购5件 编辑:程序博客网 时间:2024/05/16 14:21
iOS音视频开发相关文章:
音视频开发——概述(一)
音视频开发——流媒体数据传输RTSP(二)
音视频开发——流媒体数据传输RTP(三)
音视频开发——ffmpeg解码(四)
音视频最强大的开源库非ffmpeg莫属,网上对ffmpeg总结的最好的是雷神的博客(http://blog.csdn.net/leixiaohua1020/article/details/15811977),本文简单介绍下ffmpeg视频解码的使用。
1、ffmpeg初始化
- (void)videoDecoder_init { avcodec_register_all();// _videoFrame = av_frame_alloc(); AVCodec *codec = avcodec_find_decoder(AV_CODEC_ID_H264); _videoCodecCtx = avcodec_alloc_context3(codec); int ret = avcodec_open2(_videoCodecCtx, codec, nil); if (ret != 0){ NSLog(@"open codec failed :%d",ret); } _videoFrame = av_frame_alloc(); av_init_packet(&_packet);}
其中,
_videoCodecCtx是ffmpeg编解码对象;
_videoFrame是解码后的图像帧,可从中生成image图像;
_packet是解码前的数据帧,包括I帧、P帧等
2、解码操作
- (CGSize)videoDecoder_decodeToImage:(uint8_t *)nalBuffer size:(int)inSize { _packet.size = inSize; _packet.data = nalBuffer; CGSize frameSize = {0, 0}; while (inSize > 0) { int gotframe = 0; int len = avcodec_decode_video2(_videoCodecCtx, _videoFrame, &gotframe, &_packet); if (len < 0) { NSLog(@"decode video error, skip packet"); return frameSize; } inSize -= len; } frameSize.width = _videoCodecCtx->width; frameSize.height = _videoCodecCtx->height; _outputWidth = _videoCodecCtx->width; self.outputHeight = _videoCodecCtx->height; return frameSize;}
3、获取解码后的图像
- (UIImage *)currentImage { if (!_videoFrame->data[0]) { return nil; } [self convertFrameToRGB]; return [self imageFromAVPicture:_picture width:_outputWidth height:_outputHeight];}- (void)convertFrameToRGB { sws_scale(_img_convert_ctx, (const uint8_t * const*)_videoFrame->data, _videoFrame->linesize, 0, _videoCodecCtx->height, _picture.data, _picture.linesize);}- (UIImage *)imageFromAVPicture:(AVPicture)pict width:(int)width height:(int)height { CGBitmapInfo bitmapInfo = kCGBitmapByteOrderDefault; CFDataRef data = CFDataCreateWithBytesNoCopy(kCFAllocatorDefault, pict.data[0], pict.linesize[0] * height,kCFAllocatorNull); CGDataProviderRef provider = CGDataProviderCreateWithCFData(data); CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); CGImageRef cgImage = CGImageCreate(width, height, 8, 24, pict.linesize[0], colorSpace, bitmapInfo, provider, NULL, YES, kCGRenderingIntentDefault); CGColorSpaceRelease(colorSpace); UIImage *image = [[UIImage alloc]initWithCGImage:cgImage]; CGImageRelease(cgImage); CGDataProviderRelease(provider); CFRelease(data); return image;}
对解码后的图像传入UIImageView,即可进行视频播放
附上之前参考的ffmpeg解码播放的例子:ffmpeg解码播放:https://github.com/durfu/DFURTSPPlayer
另外,欢迎大家加入iOS音视频开发的QQ群:331753091
1 0
- 音视频开发——ffmpeg解码(四)
- FFmpeg解码音视频
- FFMPEG音视频解码
- FFmpeg浅尝辄止(三)——小试视频解码
- FFmpeg浅尝辄止(三)——小试视频解码
- FFmpeg浅尝辄止(三)——小试视频解码
- FFmpeg浅尝辄止(三)——小试视频解码
- Android 本地视频播放器开发 —— ffmpeg解码视频文件中的音频
- SDL 与 FFMPEG 音乐播放器开发(4)——使用FFMPEG库解码
- FFmpeg 音视频编解码开源库
- ffmpeg 音视频 编解码例子源码
- FFmpeg音视频编解码实践总结
- 基于ffmpeg的音视频解码原理
- FFmpeg音视频编解码实践总结
- 【FFmpeg音视频编解码技术】开篇
- FFmpeg - 视频解码过程
- ffmpeg视频解码分析
- ffmpeg解码视频
- 获取键盘高度
- 文件加密码
- HDU 2045不容易系列之(3)—— LELE的RPG难题
- ThinkPHP2.2框架执行原理、流程图在线手册
- 30左右的书籍都算经典
- 音视频开发——ffmpeg解码(四)
- ECMAScript-初回学习“函数”
- 移植uboot第一步:下载,编译,烧到板子上试验
- 编写带有block参数的函数
- CentOS代理上网
- java web获取ip,并获取ip所在的地址
- hdu5813Elegant Construction【构造 2016多校联合第七场】
- SHELL日志分析 实例一
- ideal断点变为叉