Что нового

Проверка цельности mp3 файла

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,487
Требуется проверить mp3 файл на цельность.
Файлы скачиваются с сети, и при повторной закачке нужно проверять что файл уже закачан, и что закачен полностью.

Вариант с проверкой длины трека или размера файла не подходит, это не надёжно.
 

Medic84

Омега
Команда форума
Администратор
Сообщения
1,590
Репутация
341
Проблема в том, что с сервера, кроме заголовка Content-Lenght ты ничего не сможешь получить. Чтобы рассчитать хэш сумму файла, файл должен быть на компьютере. Либо она должна быть расчитана уже на сервере и быть в свободном доступе.

Нашел вот такую программу с исходниками. Можешь посмотреть что да как там устроено. http://rutracker.org/forum/viewtopic.php?t=3620772
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,323
CreatoR [?]
Файлы скачиваются с сети
Не факт, что по ссылке лежит не битый файл. Если нужна 100-процентная уверенность, что скачанный файл целостный, то, ИМХО, нужно изучать структуру MP3-файла, читать его и проверять, или использовать готовые утилиты, их в сети не мало бесплатных, например (тоже с исходниками).
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,487
Ребята, сеть - это откуда берутся файлы, мне сеть не нужна (это просто была предыстория), мне нужно проверить файл локально.


madmasles [?]
Если нужна 100-процентная уверенность, что скачанный файл целостный
Мне нужно проверить что mp3 файл целый, пусть он даже был положен на диск с флешки.

И да, внешние программы не вариант, нужно средствами AutoIt, и желательно что процесс был ускорен, проверять нужно много файлов.
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
365
CreatoR

MediaInfo.dll ? http://autoit-script.ru/index.php?topic=8358.msg56582#msg56582

bass.dll ?
Открыть файл, проиграть с большой скоростью, проверяя, нет ли ошибок?
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,487
Хотелось бы этого добиться средствами AutoIt...
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,487
Вот тут лежат исходники от mp3val, утилита проверяет целостность mp3 файла, то что мне и нужно.
Кто нибудь может помочь реализовать подобное на AutoIt? :scratch:
Приоритет должен ставиться на скорости проверки, должно быть значительно быстрее чем вызов консольной версии утилиты.
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,487
Подмечу, исходники на C++.
Мне хотя бы вытащить данные по:
Код:
unlikely that this is a MPEG
file is truncated
no VBR header
Garbage at the beginning of the file
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
365
CreatoR
и все-таки, чем bass.dll и MediaInfo.dll не подходят?
http://forum.ixbt.com/topic.cgi?id=12:53803#20
http://forum.ixbt.com/topic.cgi?id=12:53803#22

1 dll при желании можно в сам скрипт упаковать
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,487
WSWR [?]
чем bass.dll и MediaInfo.dll не подходят?
Не удаётся определить вышеуказанные условия (те что выдаются утилитой mp3val).
Можешь показать пример как это реализовать? :whistle:
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
CreatoR
Вся информация находится в самом mp3 файле, который состоит из ID3-данных и MP3-фреймов.
IMHO, в заголовке MP3-фрейма и находится нужная вам информация.
Посмотрите вот эти ссылки, думаю они вам помогут.
MPEG Audio Compression Basics
Внутри MP3. А как оно всё устроено?

P.S. Примером помочь не могу, потому как не вникал.
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
365
CreatoR
А можно пример поврежденного файла?
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,487
Статьи хорошие, уже читал подобные, но у меня уйдёт куча времени на изучение, а мне нужно это сделать в кротчайшие сроки...
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
365
CreatoR
Да, действительно, в данном случае все не так просто, как мне подумалось
Вот два примера с bass.dll на основе работы с выложенным выше файлом.

1 - последовательно читает файл, с нормальными файлами у меня выводит 100%, с примером - показывает 89 % Думаю, и есть "Garbage at the beginning of the file" от mp3val

Код:
#include "Bass.au3"
#include "BassMix.au3"

Global $sFile = FileOpenDialog("Open...", "", "MP3 Files (*.mp3)")

$d = TimerInit()
Global $iOutputFreq = 32000

_BASS_Startup()
_BASS_MIX_Startup()

_BASS_Init(0, -1, 44100, 0, "")

Global $tBuffer = DllStructCreate("byte[20000]")
Global $pBuffer = DllStructGetPtr($tBuffer)
Global $iBuffer = DllStructGetSize($tBuffer)

$hMusicHandle = _BASS_StreamCreateFile(False, $sFile, 0, 0, $BASS_STREAM_DECODE)

$aInfo = _BASS_ChannelGetInfo($hMusicHandle)
$hMixer = _BASS_Mixer_StreamCreate($iOutputFreq, $aInfo[1], BitOR($BASS_MIXER_END, $BASS_STREAM_DECODE))
_BASS_Mixer_StreamAddChannel($hMixer, $hMusicHandle, $BASS_MIXER_FILTER)

$iBytes = _BASS_ChannelGetLength($hMusicHandle, $BASS_POS_BYTE)
$iBytes = $iBytes * $iOutputFreq / $aInfo[0]
$iDone = 0

While _BASS_ChannelIsActive($hMixer)
	$iLength = _BASS_ChannelGetData($hMixer, $pBuffer, $iBuffer)
	$iDone += $iLength
WEnd

ConsoleWrite(Round($iDone * 100 / $iBytes) & "%" & @CRLF)

_BASS_StreamFree($hMixer)
_BASS_Free()

ConsoleWrite(TimerDiff($d) & @CRLF)

2 - читает теги.
Не уверен что такое можно использовать, но с примером выводит пустую строку, а с нормальными файлами или теги, или "no artist - no title - "
Код:
#include <Bass.au3>
#include <BassConstants.au3>
#include <BassTags.au3>

_BASS_STARTUP("BASS.dll")
_Bass_Tags_Startup("BassTags.dll")

_BASS_Init(0, -1, 44100, 0, "")

$file = FileOpenDialog("Open...", "", "MP3 Files (*.mp3)")

$MusicHandle = _BASS_StreamCreateFile(False, $file, 0, 0, $BASS_MUSIC_PRESCAN)

If @error Then
    MsgBox(0, "Error", "Could not load audio file" & @CR & "Error = " & @error)
    Exit
EndIf
$tags = _Bass_Tags_Read($MusicHandle, "%IFV1(%TRCK,%TRCK. )%IFV2(%ARTI,%ICAP(%ARTI),no artist) - %IFV2(%TITL,%ICAP(%TITL) -,no title -) %IFV1(%ALBM,%IUPC(%ALBM))%IFV1(%YEAR, %(%YEAR%))")
ConsoleWrite($tags & @CRLF)
_Bass_Free()
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,487
Я думаю эти варианты медленнее чем вызов mp3val :smile:.
И нет возможности попробовать, не нахожу BassMix.au3...
 
Верх