请选择 进入手机版 | 继续访问电脑版

ChinaFFmpeg

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 7034|回复: 1

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

[复制链接]
发表于 2019-8-2 15:22:32 | 显示全部楼层 |阅读模式
本帖最后由 TyroneLi 于 2019-8-2 15:24 编辑

1.我使用ffmpeg接口去获取视频基本信息和解帧操作,视频是hevc编码,50fps,基本信息大致通过下面的方法得到:
[C++] 纯文本查看 复制代码
int stream_width, stream_heigth, fps;
    long total_frames;
    for (int i = 0; i < pFormatCtx->nb_streams; i++)
    {
        AVStream*in_stream = pFormatCtx->streams[i];
        // fps = pFormatCtx->streams[i]->r_frame_rate;
        fps = in_stream->avg_frame_rate.num / in_stream->avg_frame_rate.den;
        if (pFormatCtx->streams[i]->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解出来的数据缓冲区首地址,大致这样实现:
[C++] 纯文本查看 复制代码
cv::Mat mRGB(cv::Size(pCodecCtx->width, pCodecCtx->height), CV_8UC3);
 // mRGB.data = buffer;
/* 直接让Mat矩阵的头指针指向pFrameRGB可以更快些,避免了内存数据的拷贝 */
mRGB.data = (uchar*)pFrameRGB->data[0];


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

使用道具 举报

发表于 2019-8-7 08:27:14 | 显示全部楼层
如果单幅图,不一定明显,但是如果是连续的话,就比较明显了
三角函数浮点数计算还是挺消耗计算资源的
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|Archiver|ChinaFFmpeg

GMT+8, 2024-4-19 10:27 , Processed in 0.062011 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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