【问题标题】:android ffmpeg set frame-rateandroid ffmpeg 设置帧率
【发布时间】:2012-10-09 10:33:24
【问题描述】:

我正在从相机获取视频流,并将帧写入文件中。问题是它们是以太大的帧速率编写的,我找不到以编程方式设置它的方法。 所以我想我正在寻找控制台指令“-r [framerate]”调用的C函数

我尝试在 avFormatContext 中设置选项,但没有效果。

AVDictionary *options=NULL; 
av_dict_set(&options,"r","1",0);
    avio_open2(&oc->pb, "path", AVIO_FLAG_WRITE,options);

之后我用av_read_frame(context,&packet) 阅读框架并用av_write_frame(oc,&packet); 编写它们

任何想法我做错了什么或者我应该如何解决这个问题?

【问题讨论】:

    标签: video android-ndk ffmpeg frame-rate


    【解决方案1】:

    您可能希望自己控制相机帧速率。

    #include <stdio.h>
    #include <windows.h>  
    #include <time.h>
    ...
    double ticks; 
    int fps=25; //25 FPS for example
    uint64_t  frequency;        // ticks per second
    double freq,et; 
    double mspf=1000.0/(double)fps;
    
    QueryPerformanceFrequency((LARGE_INTEGER *) &frequency);
    freq= (frequency * 1000); 
    
    while(???) {
        ticks=GetTickCount(); // start tick 
    
        //Read/write function
        av_read_frame(context,&packet);
        av_write_frame(oc,&packet);
    
        et=(GetTickCount()-ticks)/freq; // elapsed time for current frame, in milliseconds 
        av_usleep((et+1<mspf?mspf-et:1) * 1000);
    }
    

    【讨论】:

    • 据我了解,'av_usleep' 只会使线程休眠。这不会影响输出视频的帧速率。从睡眠中返回后,程序仍会从流中读取下一帧并以相同的方式将其写入。
    • 另外重要的是我不要跳过任何帧,因为流是 h264 编码的,并且帧是相关的(1 个关键帧 + several inter frames
    • 这里的想法是从相机中获取图像的速度较慢,因此您不会跳过任何帧,并且您的代码将每 40 毫秒读/写 1 帧
    猜你喜欢
    • 2020-09-20
    • 2019-11-20
    • 2011-12-19
    • 2021-11-10
    • 1970-01-01
    • 2018-01-09
    • 2021-03-26
    • 2021-07-07
    • 1970-01-01
    相关资源
    最近更新 更多