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