TyroneLi 发表于 2019-8-2 15:22:32

Hevc编码格式视频基本信息ffmpeg接口获取,有疑问

本帖最后由 TyroneLi 于 2019-8-2 15:24 编辑

1.我使用ffmpeg接口去获取视频基本信息和解帧操作,视频是hevc编码,50fps,基本信息大致通过下面的方法得到:
int stream_width, stream_heigth, fps;
    long total_frames;
    for (int i = 0; i < pFormatCtx->nb_streams; i++)
    {
      AVStream*in_stream = pFormatCtx->streams;
      // fps = pFormatCtx->streams->r_frame_rate;
      fps = in_stream->avg_frame_rate.num / in_stream->avg_frame_rate.den;
      if (pFormatCtx->streams->codec->codec_type == AVMEDIA_TYPE_VIDEO)
      {
            videoStream = i;
            stream_width = in_stream->codec->width;
            stream_heigth = in_stream->codec->height;
            total_frames = in_stream->nb_frames;
            break;
      }
    }
    /* 获取视频时间长度 */
    long long video_duration;
    if(pFormatCtx->duration > 0)
    {
      video_duration = pFormatCtx->duration / 1000LL;
    }
    else{
      video_duration = 0;
    }

帧宽,高,视频时长以及帧率基本信息是对的上的,但是总帧数这里却拿到的值是0,换了其他的h264,h265编码的视频却可以正常拿到总帧数数据,想问下基于hevc编码的视频这里总帧数该如何获取到呢?
2.然后ffmpeg解转为opencv Mat,没有拷贝,而是将Mat指针指向从ffmpeg解出来的数据缓冲区首地址,大致这样实现:
cv::Mat mRGB(cv::Size(pCodecCtx->width, pCodecCtx->height), CV_8UC3);
// mRGB.data = buffer;
/* 直接让Mat矩阵的头指针指向pFrameRGB可以更快些,避免了内存数据的拷贝 */
mRGB.data = (uchar*)pFrameRGB->data;

这种方式解帧和opencv的videocapture类下面的<<操作解帧,哪一种会快些呢?(我个人觉得这样ffmpeg会快些,毕竟opencv底层也是用ffmpeg,不知道猜测对不对)
3.ffmpeg要是想使用cuda来加速编解码或者解帧等操作,是不是就只能参考nvidia的video sdk学习?cuda操作和ffmpeg使用cpu操作,按理cuda都会比cpu操作快吧?但是好像gpu操作如果不是把整个视频数据加载在gpu里面,那也是通过cpu不停的和gpu交换数据,这样好像也不会快多少呐?
小白刚接触ffmpeg,项目里面遇到这些疑惑,请大佬指导:dizzy:

孙悟空 发表于 2019-8-7 08:27:14

如果单幅图,不一定明显,但是如果是连续的话,就比较明显了
三角函数浮点数计算还是挺消耗计算资源的
页: [1]
查看完整版本: Hevc编码格式视频基本信息ffmpeg接口获取,有疑问