該代碼與過濾_video.c(ffmpeg doc中的一個示例代碼)幾乎相似。爲什麼AVFormatContext指針在非全局結構對象中初始化,而在全局對象中是NULL?
在原始示例文件中,有許多全局靜態變量。這裏是第一個版本的代碼的一個片段(原來一樣的樣品):
static AVFormatContext *fmt_ctx;
static AVCodecContext *dec_ctx;
int main(int argc, char **argv) {
// .... other code
if ((ret = avformat_open_input(&fmt_ctx, filename, NULL, NULL)) < 0) {
av_log(NULL, AV_LOG_ERROR, "Cannot open input file\n");
return ret;
}
// .... other code
}
由於所有這些變量充當了打開一個視頻文件,我寧願他們組。所以我的代碼的目的是重新排列這些變量,使源文件更加結構化。
我想到的第一個想法是使用結構。
struct structForInVFile {
AVFormatContext *inFormatContext;
AVCodecContext *inCodecContext;
AVCodec* inCodec;
AVPacket inPacket;
AVFrame *inFrame;
int video_stream_index;
int inFrameRate;
int in_got_frame;
};
現在的代碼的第二版就變成了:
int main(int argc, char **argv) {
// .... other code
structForInVFile inStruct;
if ((ret = avformat_open_input(&inStruct.inFormatContext, filename, NULL, NULL)) < 0) {
av_log(NULL, AV_LOG_ERROR, "Cannot open input file\n");
return ret;
}
// .... other code
}
結果爲第2版:代碼不能在avformat_open_input工作。沒有錯誤信息。該程序默默退出。 通過調試,我發現:inStruct.inFormatContext:0xffffefbd22b60000
在第三版的代碼中,我將inStruct設置爲全局變量。 代碼變爲:
structForInVFile inStruct;
int main(int argc, char **argv) {
// .... other code
if ((ret = avformat_open_input(&inStruct.inFormatContext, filename, NULL, NULL)) < 0) {
av_log(NULL, AV_LOG_ERROR, "Cannot open input file\n");
return ret;
}
// .... other code
}
第3個版本的結果:代碼有效。 通過調試,我發現:inStruct.inFormatContext:0x0
所以我認爲原因是:AVFormatContext應該零初始化爲avformat_open_input工作。 現在,問題是:
爲什麼AVFormatContext指針在非全局結構對象中初始化,而在全局對象中初始化爲零?
我不知道作爲全局變量或非全局變量的結構對象的定義有什麼區別。
謝謝。我搜索了一下,並查看了C++素數。但我認爲我沒有找到好的關鍵字來搜索正確的頁面。 – user1914692 2013-03-20 00:14:52