jpg2avframe

举报
风吹稻花香 发表于 2021/06/04 22:42:29 2021/06/04
【摘要】 https://stackoverflow.com/questions/3527584/ffmpeg-jpeg-file-to-avframe AVFrame* OpenImage(const char* imageFileName){ AVFormatContext *pFormatCtx; if(av_open_input_file(&pFormatCtx, ...

https://stackoverflow.com/questions/3527584/ffmpeg-jpeg-file-to-avframe


  
  1. AVFrame* OpenImage(const char* imageFileName)
  2. {
  3. AVFormatContext *pFormatCtx;
  4. if(av_open_input_file(&pFormatCtx, imageFileName, NULL, 0, NULL)!=0)
  5. {
  6. printf("Can't open image file '%s'\n", imageFileName);
  7. return NULL;
  8. }
  9. dump_format(pFormatCtx, 0, imageFileName, false);
  10. AVCodecContext *pCodecCtx;
  11. pCodecCtx = pFormatCtx->streams[0]->codec;
  12. pCodecCtx->width = W_VIDEO;
  13. pCodecCtx->height = H_VIDEO;
  14. pCodecCtx->pix_fmt = PIX_FMT_YUV420P;
  15. // Find the decoder for the video stream
  16. AVCodec *pCodec = avcodec_find_decoder(pCodecCtx->codec_id);
  17. if (!pCodec)
  18. {
  19. printf("Codec not found\n");
  20. return NULL;
  21. }
  22. // Open codec
  23. if(avcodec_open(pCodecCtx, pCodec)<0)
  24. {
  25. printf("Could not open codec\n");
  26. return NULL;
  27. }
  28. //
  29. AVFrame *pFrame;
  30. pFrame = avcodec_alloc_frame();
  31. if (!pFrame)
  32. {
  33. printf("Can't allocate memory for AVFrame\n");
  34. return NULL;
  35. }
  36. int frameFinished;
  37. int numBytes;
  38. // Determine required buffer size and allocate buffer
  39. numBytes = avpicture_get_size(PIX_FMT_YUVJ420P, pCodecCtx->width, pCodecCtx->height);
  40. uint8_t *buffer = (uint8_t *) av_malloc(numBytes * sizeof(uint8_t));
  41. avpicture_fill((AVPicture *) pFrame, buffer, PIX_FMT_YUVJ420P, pCodecCtx->width, pCodecCtx->height);
  42. // Read frame
  43. AVPacket packet;
  44. int framesNumber = 0;
  45. while (av_read_frame(pFormatCtx, &packet) >= 0)
  46. {
  47. if(packet.stream_index != 0)
  48. continue;
  49. int ret = avcodec_decode_video2(pCodecCtx, pFrame, &frameFinished, &packet);
  50. if (ret > 0)
  51. {
  52. printf("Frame is decoded, size %d\n", ret);
  53. pFrame->quality = 4;
  54. return pFrame;
  55. }
  56. else
  57. printf("Error [%d] while decoding frame: %s\n", ret, strerror(AVERROR(ret)));
  58. }
  59. }

文章来源: blog.csdn.net,作者:网奇,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/jacke121/article/details/87276790

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。