Иногда, если Вы попали в ситуацию когда не понятно что за файл с видео или со звуком, возникает необходимость или желание извлечь полезное содержимое из медиафайла.
Тут, чаще всего, на помощь приходит ютуб. Просто грузите туда файл и он все делает как надо. Но и ютуб не всесилен.
Понятно, что мне в руки попал откровенный мусор, но любопытство взяло свое и я решил поковыряться. Для начала попытался делать самое простое: менял расширения, пробовал открыть разными программами, но об этом было бы не интересно писать.
Потом я попробовал скормить файл программе ffprobe:
Ничего.
Обратно, тишина.
Вооружился моим любимым инструментом AutoIt.
Из файла описания форматов достаем кодеки, подставляем их в качестве расширения, скармливаем ffprobe. Если на выходе ffprobe получался файл длиной более 20 байт, то пробуем сконвертировать исходник в dvvideo или в звук.
Так, у меня все получилось, за пол-часа у меня уже была кучка файлов, с которыми я уже смог поработать.
Тут, чаще всего, на помощь приходит ютуб. Просто грузите туда файл и он все делает как надо. Но и ютуб не всесилен.
Понятно, что мне в руки попал откровенный мусор, но любопытство взяло свое и я решил поковыряться. Для начала попытался делать самое простое: менял расширения, пробовал открыть разными программами, но об этом было бы не интересно писать.
Потом я попробовал скормить файл программе 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 или в звук.
Так, у меня все получилось, за пол-часа у меня уже была кучка файлов, с которыми я уже смог поработать.