音视频开发——ffmpeg解码(四)
2016-08-10 16:18
274 查看
iOS音视频开发相关文章:
音视频开发——概述(一)
音视频开发——流媒体数据传输RTSP(二)
音视频开发——流媒体数据传输RTP(三)
音视频开发——ffmpeg解码(四)
音视频最强大的开源库非ffmpeg莫属,网上对ffmpeg总结的最好的是雷神的博客(http://blog.csdn.net/leixiaohua1020/article/details/15811977),本文简单介绍下ffmpeg视频解码的使用。
1、ffmpeg初始化
其中,
_videoCodecCtx是ffmpeg编解码对象;
_videoFrame是解码后的图像帧,可从中生成image图像;
_packet是解码前的数据帧,包括I帧、P帧等
2、解码操作
3、获取解码后的图像
对解码后的图像传入UIImageView,即可进行视频播放
附上之前参考的ffmpeg解码播放的例子:ffmpeg解码播放:https://github.com/durfu/DFURTSPPlayer
另外,欢迎大家加入iOS音视频开发的QQ群:331753091
音视频开发——概述(一)
音视频开发——流媒体数据传输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
相关文章推荐
- Android本地视频播放器开发--ffmpeg解码视频文件中的音频(2)
- FFMPEG+SDL2.0流媒体开发3---简易MP4视频播放器,提取MP4的H264视频序列解码并且显示
- Android本地视频播放器开发--ffmpeg解码视频文件中的音频(1)
- iOS 音视频开发:Audio Unit播放FFmpeg解码的音频
- 移动视频监控(2)---原型开发---(音视频编解码多平台移植(for window/wince))ffmpeg --自由之路即是曲折之路。
- 使用 FFmpeg 开发播放器基础--使用 ffmpeg 解码视频文件
- Android本地视频播放器开发--ffmpeg解码视频文件中的音频(1)
- Android本地视频播放器开发--ffmpeg解码视频文件中的音频(1)
- Android 本地视频播放器开发 —— ffmpeg解码视频文件中的音频
- FFMPEG SDK流媒体开发2---分离.mp4等输入流音视频并且进行解码输出(转)
- 【FFMpeg视频开发与应用基础】三、调用FFmpeg SDK对H.264格式的视频压缩码流进行解码
- 第三章:ffmpeg和QT开发播放器之视频的解码转码
- 移动视频监控(2)---原型开发---(音视频编解码多平台移植(for window/wince))ffmpeg --自由之路即是曲折之路。
- Android本地视频播放器开发--ffmpeg解码视频文件中的音频(1)
- Android本地视频播放器开发--ffmpeg解码视频文件中的音频(2)
- Android本地视频播放器开发--ffmpeg解码视频文件中的音频(2)
- Android本地视频播放器开发--ffmpeg解码视频文件中的音频(1)
- 【视频开发】 ffmpeg支持的硬解码接口
- FFMPEG解复用、解码测试,音频保存WAV文件,视频保存为PPM图像
- ffmpeg解码视频存为BMP文件