問題的可能原因:
可能是傳遞給avformat_alloc_output_context2()函數的filename參數不對,並不是一個正常的字符串。
問題解決辦法:
檢查avformat_alloc_output_context2()的輸入參數是否都合理。
問題歷程:
在使用QT+ffmpeg庫做錄屏軟件時,需要打開一個output文件,用來保錄制的視頻。在打開輸出文件時主要是使用avformat_alloc_output_context2()函數,這個函數需要給他傳遞輸出格式名,以及輸出文件名稱,這些類型都是const char*。
一般而言,我們可能是通過參數化來傳遞給輸出文件名稱,所以可能存在需要將QString類型轉換層const char*的操作,QT中支持這種操作,一般可以通過 para_filename.toStdString().c_str()來將QString類型的para_filename轉換成const char* 類型。
邏輯上似乎都合理,但是偶爾情況下,可能會發生如標題所示的問題。很是奇怪,錯誤日志提示我們output怎么變成了‘i’,通過輸出日志發現para_filename.toStdString().c_str()的轉換並非按照我們的邏輯來的,因為.c_str()調用對象是一個由toStdString()生成的臨時對象,很有可能在c_str()調用前已經被析構釋放了,導致最后轉換的結果並非我們所期望的。所以解決辦法就是分開成兩步:(1).定義std::string類型變量,並先由QString->std::string,(2).定義const char*類型變量,並從std::string->const char*。
通過上述兩個步驟就可保證字符串類型的順利及可靠的轉換,傳遞給avformat_alloc_output_context2()函數的參數不再是錯誤的了。
一度以為是ffmpeg的問題,查了好久沒有所以然,后來想到輸入是不是有問題,遂定位到問題。