Я пишу сценарий с помощью плагина браузера VLC , чтобы определить длину любого видеофайла.Сначала я говорю VLC, чтобы попытаться воспроизвести файл.Затем я периодически проверяю его длину.Как только он говорит мне, что длина не равна нулю, я знаю, что видео успешно начало воспроизводиться, и длина является точной.
Сложная часть - обнаружение ошибок.Я должен определить, является ли предоставленный файл видео с ошибками или вообще не видео.Кто-то может лежать с текстовым файлом с неправильным названием video.avi, и VLC не сможет его воспроизвести.Я произвольно решил, что, если VLC сообщит, что длина равна 0 в течение 5 секунд подряд, то я считаю, что предоставленный файл будет лишним.Это точное предположение?Возможно ли, что сильно фрагментированный жесткий диск займет более 5 секунд, чтобы снабдить VLC видеофайлом?Имеет ли битрейт файла какое-либо отношение ко времени чтения?
Ниже приведен фрагмент моего Javascript, который определяет длину файла.Вам не нужно читать это, чтобы понять мой вопрос, но некоторые из вас хотели бы видеть это.
/**
* Find the total length of a playlist item.
*
* @param PlaylistItem playlistItem
* @param options
* onSuccess: void function(int length)
* onFailure: void function() - timeout
* onComplete: void function() - called after onSuccess or onFailure
* @return void
*/
findLength: function(playlistItem, options) {
var option = {
onSuccess: Prototype.emptyFunction,
onFailure: Prototype.emptyFunction,
onComplete: Prototype.emptyFunction
};
Object.extend(option, options);
if (playlistItem.getLength() > 0) {
option.onSuccess(playlistItem.getLength());
option.onComplete();
}
if (this.lengthPoller) {
this.lengthPoller.stop();
}
this.preview(playlistItem);
this.lengthPoller = new PeriodicalExecuter(
function(poller) {
if (this.secondsInComa >= MYAPP.Vlc.MAX_SECONDS_IN_COMA) {
this.secondsInComa = 0;
option.onFailure();
this.stop();
poller.stop();
option.onComplete();
} else {
var currLength = this.vlc.input.length;
if (currLength > 0) {
currLength /= 1000;
playlistItem.setLength(currLength);
option.onSuccess(currLength);
this.secondsInComa = 0;
this.stop();
poller.stop();
option.onComplete();
} else {
this.secondsInComa += MYAPP.Vlc.LENGTH_POLLING_PERIOD;
}
}
}.bind(this),
MYAPP.Vlc.LENGTH_POLLING_PERIOD
);
}