簡體   English   中英

如何在C ++中檢查給定的文件是否是有效的視頻文件?

[英]How to check whether a given file is a valid video file in C++?

我嘗試使用OpenCV做到這一點:

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

但是,當我嘗試傳遞.txt文件時,VideoCapture出於未知原因成功讀取了該文件。 當我嘗試查找視頻中的幀數時,

if(cap.get(cv::CV_CAP_PROP_FRAME_COUNT) == 0) printf("Invalid video\n");

每次執行時,我得到的幀數都不相同。 我還嘗試在文件中查找框架的寬度和高度,

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?

確定文件是否“有效”的唯一真正好方法是使用具有適當格式的讀取器功能來讀取其內容。 沒有簡單的通用標記可以說“這是一個真實的視頻文件,不能再有其他東西了”-即使存在,有人可能有意或無意地將其放入了文件中,因此看起來像是“真實視頻”,但當您閱讀其余信息時不是。 由於存在數十種不同的視頻文件格式,因此很難做到比“嘗試一下,看看會發生什么”更明智的事情。

如另一個答案中所述, cv::VideoCapture::read()將讀取文件,並在文件無效時返回錯誤指示。 如果要區分“文件不存在”,則可以在嘗試讀取文件之前進行一些檢查,因此可以說“文件不存在”,而不是“抱歉,但這似乎不是”有效視頻文件”-盡管后者也適用於“也沒有這樣的文件”。

請注意,如果文件存在,我希望cv::VideoCapture會說isOpened() ,因此對於文本文件或PDF,它將很樂意接受為“打開”。 您實際上必須嘗試讀取該文件以判斷它是否為視頻文件。 但是,就“輸入錯誤會發生什么”而言, ::get::read的文檔都幾乎沒有用,似乎這些函數僅設計用於有效輸入。

我不熟悉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;
    }
}

只需傳遞文件名和所需的文件擴展名即可,例如“ .mp4”。 您可以更改此方法以采用向量作為結束字符串,並檢查向量中可以放置.mp4 .avi等的每個字符串。

您可以使用VideoCapture::read() ,如果滿足以下條件,則將返回false:

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

例:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM