Pull to refresh

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

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

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

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

Потом я попробовал скормить файл программе 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 или в звук.

Так, у меня все получилось, за пол-часа у меня уже была кучка файлов, с которыми я уже смог поработать.
Tags:
Hubs:
+8
Comments 7
Comments Comments 7

Articles