C++ 如何在c++;?

C++ 如何在c++;?,c++,ffmpeg,frame-rate,C++,Ffmpeg,Frame Rate,我有视频文件。如何在FC++中用C++获得视频的FPS? 请键入完整的代码。您可以像这样执行ffmpeg.exeffmpeg-i filename,如果不可变,它将输出帧率 例如: 输入#0,matroska,webm,来自'somerandom.mkv': 持续时间:01:16:10.90,开始时间:0.000000,比特率:不适用 流#0.0:视频:h264(高),yuv420p,720x344[标准杆1:1 DAR 90:43],每秒25帧,每分钟25次,每分钟1k,每分钟50次(默认)

我有视频文件。如何在FC++中用C++获得视频的FPS?
请键入完整的代码。

您可以像这样执行ffmpeg.exe
ffmpeg-i filename
,如果不可变,它将输出帧率

例如:

输入#0,matroska,webm,来自'somerandom.mkv':
持续时间:01:16:10.90,开始时间:0.000000,比特率:不适用
流#0.0:视频:h264(高),yuv420p,720x344[标准杆1:1 DAR 90:43],每秒25帧,每分钟25次,每分钟1k,每分钟50次(默认)
流#0.1:音频:aac,48000 Hz,立体声,s16(默认)

此视频的fps为25

要执行程序,可以使用中的答案


来源:

这是我编写的一个简单程序,用于将视频信息转储到控制台:

#include <libavformat/avformat.h>

int main(int argc, const char *argv[])
{
    if (argc < 2)
    {
        printf("No video file.\n");
        return -1;
    }

  av_register_all();

  AVFormatContext *pFormatCtx = NULL;

  //open video file
  if (avformat_open_input(&pFormatCtx, argv[1], NULL, NULL) != 0)
    return -1;

    //get stream info
    if (avformat_find_stream_info(pFormatCtx, NULL) < 0)
        return -1;

    av_dump_format(pFormatCtx, 0, argv[1], 0);
}

推荐。

@zhm的答案非常接近,我只做了一个小的更新来获得帧速率。在我这边,我需要比特率,这是
AVFormatContext*
中的
int64\t

对于FPS,您需要浏览流列表,可能需要检查它是音频还是视频,然后访问
r\u frame\u rate
,这是一个
AVRational
值。该参数是一个命名符和分母,您可以简单地将一个除以另一个得到一个double,它们甚至提供了一个函数(
av_q2d()
)来实现这一点

int main(int argc, char * argv[])
{
    if (argc < 2)
    {
        printf("No video file.\n");
        return -1;
    }

    av_register_all();

    AVFormatContext *pFormatCtx = NULL;

    //open video file
    if (avformat_open_input(&pFormatCtx, argv[1], NULL, NULL) != 0)
        return -1;

    //get stream info
    if (avformat_find_stream_info(pFormatCtx, NULL) < 0)
        return -1;

    // dump the whole thing like ffprobe does
    //av_dump_format(pFormatCtx, 0, argv[1], 0);

    // get the frame rate of each stream
    for(int idx(0); idx < pFormatCtx->nb_streams; ++idx)
    {
        AVStream *s(pFormatCtx->streams[idx]);
        std::cout << idx << ". " << s->r_frame_rate.nom
                  << " / " << s->r_frame_rate.den
                  << " = " << av_q2d(s->r_frame_rate)
                  << "\n";
    }

    // get the video bit rate
    std::cout << "bit rate " << pFormatCtx->bit_rate << "\n";

    return 0;
}
intmain(intargc,char*argv[])
{
如果(argc<2)
{
printf(“没有视频文件。\n”);
返回-1;
}
av_寄存器_all();
AVFormatContext*pFormatCtx=NULL;
//打开视频文件
if(avformat\u open\u输入(&pFormatCtx,argv[1],NULL,NULL)!=0)
返回-1;
//获取流信息
if(avformat\u find\u stream\u info(pFormatCtx,NULL)<0)
返回-1;
//像ffprobe一样扔掉整个东西
//av_转储_格式(pFormatCtx,0,argv[1],0);
//获取每个流的帧速率
对于(int idx(0);idxnb_streams;++idx)
{
AVStream*s(pFormatCtx->streams[idx]);

std::cout不是一个代码编写服务;首先尝试任务,发布您的问题(带有您已经尝试过的示例)你应该自己尝试,然后用你所做的代码提问。我们不会为你做所有的工作。你读过这个问题吗?问题是在C++中做。不是用命令行。@加布里埃德格里穆尔,所以你不能从C++执行程序,我们都知道你能,为什么这不是一个有效的解决方案?(当然这不是最好的,但它是一个解决方案)这是一个与问题无关的答案。如果他想在windows、linux、mac上制作一个交叉编译的应用程序,这将是非常困难的。而且,在你的代码中发送这样一个命令,这是一个巨大的安全问题。因此,不,你的答案并不好,因为1/不要回答问题,2/如果它确实给代码带来巨大的问题。@GabrieldeGrimouard确保它回答了问题,1执行应用程序2.解析结果,tada your done.是的,它有缺点,但它确实解决了问题。我们不知道他将如何使用它1.我们不知道他是否希望它是跨平台的。2.我们不知道这是否是一件一次性的事情,安全性可能会受到影响没关系?如果你真的想回答这个问题,你应该给他写下如何在C++中调用它。否则答案不是C++。如果你这样做,我会告诉你的。谢谢,但是我认为有函数(f(string file Netring)-> double)允许得到这个信息。
int main(int argc, char * argv[])
{
    if (argc < 2)
    {
        printf("No video file.\n");
        return -1;
    }

    av_register_all();

    AVFormatContext *pFormatCtx = NULL;

    //open video file
    if (avformat_open_input(&pFormatCtx, argv[1], NULL, NULL) != 0)
        return -1;

    //get stream info
    if (avformat_find_stream_info(pFormatCtx, NULL) < 0)
        return -1;

    // dump the whole thing like ffprobe does
    //av_dump_format(pFormatCtx, 0, argv[1], 0);

    // get the frame rate of each stream
    for(int idx(0); idx < pFormatCtx->nb_streams; ++idx)
    {
        AVStream *s(pFormatCtx->streams[idx]);
        std::cout << idx << ". " << s->r_frame_rate.nom
                  << " / " << s->r_frame_rate.den
                  << " = " << av_q2d(s->r_frame_rate)
                  << "\n";
    }

    // get the video bit rate
    std::cout << "bit rate " << pFormatCtx->bit_rate << "\n";

    return 0;
}