анализ медиа файлов

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

Тут, чаще всего, на помощь приходит ютуб.
Просто грузите туда файл и он все делает как надо.
Но и ютуб не всесилен.

Понятно, что мне в руки попал откровенный мусор, но любопытство взяло свое и я решил поковыряться.
Для начала попытался делать самое простое: менял расширения, пробовал открыть разными программами, но об этом было бы не интересно писать.

Потом я попробовал скормить файл программе ffprobe

ffprobe -v quiet -print_format ini -show_format -show_streams "in" > "in.ini"

Ничего.

ffprobe -v quiet -print_format ini -show_format -show_streams "in.avi" > "in.avi.ini"

Обратно, тишина.

Вооружился моим любимым инструментом AutoIt

#include <Array.au3> #include <File.au3>  RunWait("cmd /c ""ffmpeg -formats > formats.txt""") Sleep(100)  $f = FileOpen("formats.txt") $s = " " $file = "in" $prev = ""  $sFile = $file $descriptionFile = $sFile & ".ini" $cmd_info = "cmd /c ""ffprobe -v quiet -print_format ini -show_format -show_streams " & $sFile & " > """ & $descriptionFile & """" RunWait($cmd_info)  Sleep(100)  If FileGetSize($descriptionFile) > 20 Then 	$cmd_video = "ffmpeg -i " & $sFile & " -target dvvideo " & $sFile & ".avi" 	RunWait($cmd_video) 	Sleep(100)  	$cmd_audio = "ffmpeg -i " & $sFile & " -vn -c:a pcm_s16le " & $sFile & ".wav" 	RunWait($cmd_audio) 	Sleep(100) Else 	FileDelete($descriptionFile) EndIf  While $s <> "" 	$s = FileReadLine($f) 	$ext = "." & StringMid($s, 5, StringInStr(StringMid($s, 5), " ") - 1) 	FileMove($file & $prev, $file & $ext, $FC_OVERWRITE)  	$sFile = $file & $ext 	$descriptionFile = $sFile & ".ini" 	$cmd_info = "cmd /c ""ffprobe -v quiet -print_format ini -show_format -show_streams " & $sFile & " > """ & $descriptionFile & """" 	RunWait($cmd_info)  	$prev = $ext  	Sleep(500)  	If FileGetSize($descriptionFile) > 20 Then 		$cmd_video = "ffmpeg -i " & $sFile & " -target dvvideo " & $sFile & ".avi" 		RunWait($cmd_video) 		Sleep(100)  		$cmd_audio = "ffmpeg -i " & $sFile & " -vn -c:a pcm_s16le " & $sFile & ".wav" 		RunWait($cmd_audio) 		Sleep(100) 	Else 		FileDelete($descriptionFile) 	EndIf  WEnd FileClose($f)

Из файла описания форматов достаем кодеки, подставляем их в качестве расширения, скармливаем ffprobe
Если на выходе ffprobe получался файл длиной более 20 байт, то пробуем сконвертировать исходник в dvvideo или в звук.
Так, у меня все получилось, за пол-часа у меня уже была кучка файлов, с которыми я уже смог поработать.
ссылка на оригинал статьи https://habrahabr.ru/post/326754/

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *