2017-07-04 141 views
0

我嘗試使用OpenCV的做到這一點:如何檢查給定文件是否是C++中的有效視頻文件?

std::string input_name = "<path to file>"; 
cv::VideoCapture cap(input_name); 
if(!cap.isOpened()) printf("Invalid video\n"); 

然而,當我嘗試通過一個txt文件,VideoCapture成功地讀取它,原因不明。當我嘗試查找視頻中的幀數時,我在每次執行時都會獲得不同數量的幀。我也試過在文件中找到一個幀的寬度和高度,

cv::Mat Frame; 
if(!cap.read(Frame)) printf("Cannot read frame\n"); 
else 
{ 
    printf("Frame width is %d\n", Frame.cols); 
    printf("Frame height is %d\n", Frame.rows); 
} 

它們的值分別是640和400。這是爲什麼發生?有沒有辦法檢查給定的文件是否是有效的視頻文件,最好使用OpenCV?

+0

爲什麼你不能簡單地檢查擴展名? –

+0

@ShawnMathew - 因爲擴展可以說謊嗎?它們不過是一種快速找出文件處理程序應該查找的元數據的手段。有些玩家可以算出來,儘管錯誤的延伸(他們只是抱怨)。 – StoryTeller

+0

@ShawnMathew如果我找不到其他方法,我會這樣做。只是想知道這是否可以使用OpenCV – niranjantdesai

回答

0

我對openCV並不熟悉,但可以隨時檢查文件擴展名。

KDT在這個問題 https://stackoverflow.com/a/874160/4612406

bool hasEnding (std::string const &fullString, std::string const &ending) 
{ 
    if (fullString.length() >= ending.length()) { 
     return (0 == fullString.compare (fullString.length() - ending.length(), ending.length(), ending)); 
    } else { 
     return false; 
    } 
} 

寫了這樣的方法只是通過文件,你要像」約會專家「 的文件擴展名。您可以更改此方法,以便矢量結束串和載體檢查每個字符串在那裏你可以把約會專家.AVI等

0

可以使用方法VideoCapture::read(),將返回false,如果:

  • 視頻損壞
  • 字符串路徑指向一個無效的文件

例如:

cv::VideoCapture cap(input_name); 
auto x = cap.read(im); 
+1

正如在這個問題,我做到了。即使輸入是.txt文件,它也不會返回錯誤 – niranjantdesai

1

確定文件是否「有效」的唯一真正好方法是使用能夠理解格式的適當閱讀器函數來閱讀其內容。沒有一個簡單的通用標記可以說「這是一個真正的視頻文件,不能是別的東西」 - 即使有人可以故意或錯誤地將其放入文件中,以使其看起來像「真正的視頻」,但不是當你閱讀其餘的信息。由於有幾十種不同的視頻文件格式,因此很難做出比「嘗試它,看看會發生什麼」更明智的事情。

正如在另一個答案中所述,cv::VideoCapture::read()將讀取該文件並返回錯誤指示,如果該文件無效。如果你想區分「文件不存在」,你可以在嘗試讀取它之前做一些檢查,這樣你就可以說「文件不存在」而不是「抱歉」,但似乎這不是一個有效的視頻文件「 - 儘管後者適用於」沒有這樣的文件「。

請注意,如果文件存在,我希望cv::VideoCaptureisOpened(),所以對於文本文件或PDF,它會高興地接受爲「打開」。您必須實際嘗試讀取文件以確定它是否爲視頻文件。但是,::get::read的文檔在「輸入錯誤時會發生什麼」方面相當無用,它幾乎看起來像函數只能用於有效輸入。

+0

是的,即使輸入文件是.txt,'cv :: VideoCapture :: read()'也會返回true – niranjantdesai

相關問題