2012-10-18 159 views
0

我從相機獲取的視頻流和我寫在文件中的幀。問題在於它們的寫入速度太大,我找不到以編程方式設置它的方法。 所以我認爲我正在尋找控制檯指令調用的C函數「-r [framerate]」Android的ffmpeg的組幀速率

我嘗試在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);

任何IDEEA什麼,我做錯了,或者我應該如何解決這個書面方式呢?

回答

0

您可能想自己控制攝像機的幀率。

#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); 
} 
+0

從我的理解'av_usleep'只會讓線程睡眠。這對輸出視頻的幀速率沒有影響。從睡眠中返回後,程序仍然會從流中讀取下面的幀並以相同的方式寫下來。 –

+0

此外,我不跳過任何幀,作爲流被H264編碼是很重要的,並且這些幀是相關的(1個關鍵幀+ [幾個幀間幀(http://en.wikipedia.org/wiki/Inter_frame )) –

+0

這裏的想法是讓相機中的圖像變慢,所以你不會跳過任何一幀,你的代碼每隔40毫秒讀/寫一幀 –