本帖最后由 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,项目里面遇到这些疑惑,请大佬指导
|