VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 125|回复: 2

求助:读到的视频文件信息,和文件不一致呀???

[复制链接]
38_avatar_middle
最佳答案
0 
在线会员 发表于 2022-5-25 10:19:31 | 显示全部楼层 |阅读模式
求助:读到的视频文件信息,和文件不一致呀???

小白自学编程,处处遇问题。。。。
自学FFmpeg,一字一句地抄写代码。
反复核对,没有错误。。。。
读到的视频格式,高720 正解,宽328470768, 实际宽 1280

到底什么原因呀???
求助:读到的视频文件信息,和文件不一致呀???
求助:读到的视频文件信息,和文件不一致呀???
  1. // FFmpegPlayer.cpp : 定义控制台应用程序的入口点。
  2. //

  3. #include "stdafx.h"

  4. extern "C" {
  5. #include"libavcodec\avcodec.h"
  6. #include"libavformat\avformat.h"
  7. #include"libswscale\swscale.h"
  8. #include"libavutil\imgutils.h"
  9. #include"libswresample\swresample.h"
  10. }

  11. AVFormatContext *fmt_ctx;

  12. //流队列中,视频流所在的位置
  13. int video_index = -1;

  14. //视频解码上下文
  15. AVCodecContext *video_codec_ctx;

  16. //输出缓存大小
  17. int video_out_buffer_size;

  18. //输出缓存
  19. uint8_t *video_out_buffer;

  20. //转码后输出的视频帧(如yur转rgb24)
  21. AVFrame *video_out_frame = av_frame_alloc();

  22. //格式转换上下文
  23. struct SwsContext *video_convert_ctx;

  24. //解码前数据包
  25. AVPacket *packet = (AVPacket *)malloc(sizeof(AVPacket));

  26. //初始化FFmpeg
  27. //@param *url 媒体地址(本地/网络地址)
  28. int init_ffmpeg(char *url) {
  29.         av_register_all();        //注册组件
  30.         avformat_network_init();        //支持网络流
  31.         fmt_ctx = avformat_alloc_context();

  32.         //打开文件
  33.         if (avformat_open_input(&fmt_ctx, url, NULL, NULL) != 0) {
  34.                 return -1;
  35.         }

  36.         //查找流信息
  37.         if (avformat_find_stream_info(fmt_ctx, NULL) < 0)
  38.         {
  39.                 return -1;
  40.         }

  41.         //找到流队列中,视频流所在位置
  42.         for (int i = 0; i < fmt_ctx->nb_streams; i++) {
  43.                 if (fmt_ctx->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO)
  44.                 {
  45.                         video_index = i;
  46.                         break;
  47.                 }
  48.         }

  49.         //视频流没有找到
  50.         if (video_index == -1)
  51.         {
  52.                 return -1;
  53.         }

  54.         //查找解码器
  55.         video_codec_ctx = fmt_ctx->streams[video_index]->codec;
  56.         AVCodec *video_codec = avcodec_find_decoder(video_codec_ctx->codec_id);

  57.         //解码器没找到
  58.         if (video_codec == NULL)
  59.         {
  60.                 return -1;
  61.         }

  62.         //打开解码器
  63.         if (avcodec_open2(video_codec_ctx, video_codec, NULL) < 0)
  64.         {
  65.                 return -1;
  66.         }

  67.         //计算输出缓存
  68.         video_out_buffer_size = av_image_get_buffer_size(
  69.                 AV_PIX_FMT_RGB24,
  70.                 video_codec_ctx->width,
  71.                 video_codec_ctx->height,
  72.                 1);

  73.         //输出缓存
  74.         video_out_buffer = new uint8_t[video_out_buffer_size];

  75.         //准备一些参数,在视频格式转换后,参数将被设置值
  76.         av_image_fill_arrays(
  77.                 video_out_frame->data,        //转换后的数据
  78.                 video_out_frame->linesize,
  79.                 video_out_buffer,        //视频buffer
  80.                 AV_PIX_FMT_RGB24,        //像素格式
  81.                 video_codec_ctx->width,
  82.                 video_codec_ctx->height,
  83.                 1);

  84.         video_convert_ctx = sws_getContext(  //图片格式转换上下文
  85.                 video_codec_ctx->width,
  86.                 video_codec_ctx->height,
  87.                 video_codec_ctx->pix_fmt,
  88.                 video_codec_ctx->width,
  89.                 video_codec_ctx->height,
  90.                 AV_PIX_FMT_RGB24,        //转码为RGB像素
  91.                 SWS_BICUBIC,
  92.                 NULL, NULL, NULL);

  93.         av_init_packet(packet);
  94.         return 0;
  95. }

  96. //读取一帧
  97. int read_frame() {
  98.         int ret = -1;

  99.         //从packet中解出一帧,0为未解出
  100.         int got_picture;

  101.         //从packet中解出来的原始视频帧
  102.         AVFrame *original_video_frame = av_frame_alloc();

  103.         if (av_read_frame(fmt_ctx, packet) == 0) {
  104.                 if (packet->stream_index == video_index)
  105.                 {
  106.                         //解码,输入为packet, 输出为original_video_frame
  107.                         if (avcodec_decode_video2(video_codec_ctx, original_video_frame, &got_picture, packet) >= 0)
  108.                         {
  109.                                 if (got_picture)
  110.                                 {
  111.                                         //图片格式转换(上面图片转换准备的参数,在这时使用)
  112.                                         sws_scale(video_convert_ctx,//图片转换上下文
  113.                                                 (const uint8_t* const*)original_video_frame->data,  //原始数据
  114.                                                 original_video_frame->linesize,  //原始参数
  115.                                                 0,  //转码开始游标,一般为0
  116.                                                 video_codec_ctx->height,  //行数
  117.                                                 video_out_frame->data,  //转码后的数据
  118.                                                 video_out_frame->linesize);
  119.                                         ret = 1;
  120.                                 }
  121.                         }
  122.                 }
  123.         }

  124.         av_free_packet(packet);
  125.         av_free(original_video_frame);
  126.         return ret;
  127. }

  128. //获取视频缓存大小
  129. int get_video_buffer_size() {
  130.         return video_out_buffer_size;
  131. }

  132. //获取视频帧
  133. char *get_video_frame() {
  134.         return (char *)video_out_buffer;
  135. }

  136. //获取视频宽度
  137. int get_video_width() {
  138.         return video_codec_ctx->width;
  139. }

  140. //获取视频高度
  141. int get_video_height() {
  142.         return video_codec_ctx->height;
  143. }

  144. //释放资源
  145. void release() {
  146.         sws_freeContext(video_convert_ctx);

  147.         av_free(video_out_frame);

  148.         av_free(video_out_buffer);

  149.         avcodec_close(video_codec_ctx);

  150.         avformat_close_input(&fmt_ctx);
  151. }


  152. int main()
  153. {
  154.         //char url[] = "rtmp://live.hkstv.hk.lxdns.com/live/hks";
  155.         char url[] = "F:\\KwDownload\\搞笑视频\\黑妹在外被狗咬.mp4";
  156.         int init_ret = init_ffmpeg(url);
  157.         if (init_ret >= 0)
  158.         {
  159.                 while (read_frame() < 0) //读取一帧,直到读到数据
  160.                 {
  161.                         printf("未读取到数据\n");
  162.                 }
  163.                 printf("高度:%d  宽度:%d  缓存大小:%d", get_video_height(), get_video_width, get_video_buffer_size);
  164.                 printf("\n==================================\n");
  165.                 printf(get_video_frame()); //打印出来,虽然打印出来的东西年不懂,但证明已经获取到一帧数据了
  166.         }
  167.         else
  168.         {
  169.                 printf("初始化失败!");
  170.         }
  171.         return 0;
  172. }
复制代码


源代码文件
求助:读到的视频文件信息,和文件不一致呀??? FFmpegPlayer.rar (1.91 KB, 下载次数: 1)




上一篇:STrip = inet_ntoa(clientAddr.sin_addr);
下一篇:关于fstream的疑问
38_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2022-5-25 10:43:06 | 显示全部楼层
前面部分是复制,后半部分根据提示输入。。。
就把括号忘记了。。。。。

求助:读到的视频文件信息,和文件不一致呀???
60_avatar_middle
最佳答案
0 
在线会员 发表于 2022-5-28 10:17:30 | 显示全部楼层
你上面的两个get_video_width()和get_video_size()缺少了括号,第一张图里展示的是这两个函数的内存地址
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号-4 )|网站地图wx_jqr

GMT+8, 2022-7-7 19:49

Powered by CcTry.CoM

© 2009-2021 cctry.com

快速回复 返回顶部 返回列表