当前位置:   article > 正文

音视频开发——ffmpeg解码(四)_ffmpeg video codec

ffmpeg video codec

iOS音视频开发相关文章:

音视频开发——概述(一)

音视频开发——流媒体数据传输RTSP(二)

音视频开发——流媒体数据传输RTP(三)

音视频开发——ffmpeg解码(四)


音视频最强大的开源库非ffmpeg莫属,网上对ffmpeg总结的最好的是雷神的博客(http://blog.csdn.net/leixiaohua1020/article/details/15811977),本文简单介绍下ffmpeg视频解码的使用。

1、ffmpeg初始化

  1. - (void)videoDecoder_init {
  2. avcodec_register_all();
  3. // _videoFrame = av_frame_alloc();
  4. AVCodec *codec = avcodec_find_decoder(AV_CODEC_ID_H264);
  5. _videoCodecCtx = avcodec_alloc_context3(codec);
  6. int ret = avcodec_open2(_videoCodecCtx, codec, nil);
  7. if (ret != 0){
  8. NSLog(@"open codec failed :%d",ret);
  9. }
  10. _videoFrame = av_frame_alloc();
  11. av_init_packet(&_packet);
  12. }

其中,

_videoCodecCtx是ffmpeg编解码对象;

_videoFrame是解码后的图像帧,可从中生成image图像;

_packet是解码前的数据帧,包括I帧、P帧等

2、解码操作

  1. - (CGSize)videoDecoder_decodeToImage:(uint8_t *)nalBuffer size:(int)inSize {
  2. _packet.size = inSize;
  3. _packet.data = nalBuffer;
  4. CGSize frameSize = {0, 0};
  5. while (inSize > 0) {
  6. int gotframe = 0;
  7. int len = avcodec_decode_video2(_videoCodecCtx,
  8. _videoFrame,
  9. &gotframe,
  10. &_packet);
  11. if (len < 0) {
  12. NSLog(@"decode video error, skip packet");
  13. return frameSize;
  14. }
  15. inSize -= len;
  16. }
  17. frameSize.width = _videoCodecCtx->width;
  18. frameSize.height = _videoCodecCtx->height;
  19. _outputWidth = _videoCodecCtx->width;
  20. self.outputHeight = _videoCodecCtx->height;
  21. return frameSize;
  22. }

3、获取解码后的图像

  1. - (UIImage *)currentImage {
  2. if (!_videoFrame->data[0]) {
  3. return nil;
  4. }
  5. [self convertFrameToRGB];
  6. return [self imageFromAVPicture:_picture width:_outputWidth height:_outputHeight];
  7. }
  8. - (void)convertFrameToRGB {
  9. sws_scale(_img_convert_ctx, (const uint8_t * const*)_videoFrame->data, _videoFrame->linesize, 0, _videoCodecCtx->height, _picture.data, _picture.linesize);
  10. }
  11. - (UIImage *)imageFromAVPicture:(AVPicture)pict width:(int)width height:(int)height {
  12. CGBitmapInfo bitmapInfo = kCGBitmapByteOrderDefault;
  13. CFDataRef data = CFDataCreateWithBytesNoCopy(kCFAllocatorDefault, pict.data[0], pict.linesize[0] * height,kCFAllocatorNull);
  14. CGDataProviderRef provider = CGDataProviderCreateWithCFData(data);
  15. CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
  16. CGImageRef cgImage = CGImageCreate(width,
  17. height,
  18. 8,
  19. 24,
  20. pict.linesize[0],
  21. colorSpace,
  22. bitmapInfo,
  23. provider,
  24. NULL,
  25. YES,
  26. kCGRenderingIntentDefault);
  27. CGColorSpaceRelease(colorSpace);
  28. UIImage *image = [[UIImage alloc]initWithCGImage:cgImage];
  29. CGImageRelease(cgImage);
  30. CGDataProviderRelease(provider);
  31. CFRelease(data);
  32. return image;
  33. }

对解码后的图像传入UIImageView,即可进行视频播放



附上之前参考的ffmpeg解码播放的例子:ffmpeg解码播放:https://github.com/durfu/DFURTSPPlayer

另外,欢迎大家加入iOS音视频开发的QQ群:331753091

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/1018873
推荐阅读
相关标签
  

闽ICP备14008679号