Иногда, если Вы попали в ситуацию когда не понятно что за файл с видео или со звуком, возникает необходимость или желание извлечь полезное содержимое из медиафайла.
Тут, чаще всего, на помощь приходит ютуб. Просто грузите туда файл и он все делает как надо. Но и ютуб не всесилен.
Понятно, что мне в руки попал откровенный мусор, но любопытство взяло свое и я решил поковыряться. Для начала попытался делать самое простое: менял расширения, пробовал открыть разными программами, но об этом было бы не интересно писать.
Потом я попробовал скормить файл программе 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 или в звук.
Так, у меня все получилось, за пол-часа у меня уже была кучка файлов, с которыми я уже смог поработать.
Поделиться с друзьями
tsklab
А чем вам не угодил MediaInfo, ставший стандартом де-факто?
AntonCheloshkin
вот поэтому
General
Complete name: tmp\in.wav
File size: 1.21 GiB
eof
tsklab
General
Complete name : S:\2005~2015 Bones (Кости) [ТВ3]\2005~2006 season 1\Bones s01e16 · США · 2005.avi
Format : AVI
Format/Info : Audio Video Interleave
File size : 406 MiB
Duration : 44 min 10 s
Overall bit rate : 1 286 kb/s
Writing application : VirtualDubMod 1.5.10.2 (build 2542/release)
Writing library : VirtualDubMod build 2542/release
Video
ID : 0
Format : MPEG-4 Visual
Format profile : Advanced Simple@L5
Format settings, BVOP : 2
Format settings, QPel : No
Format settings, GMC : No warppoints
Format settings, Matrix : Default (H.263)
Muxing mode : Packed bitstream
Codec ID : XVID
Codec ID/Hint : XviD
Duration : 44 min 10 s
Bit rate : 1 016 kb/s
Width : 624 pixels
Height : 352 pixels
Display aspect ratio : 16:9
Frame rate : 23.976 (24000/1001) FPS
Color space : YUV
Chroma subsampling : 4:2:0
Bit depth : 8 bits
Scan type : Progressive
Compression mode : Lossy
Bits/(Pixel*Frame) : 0.193
Stream size : 321 MiB (79%)
Writing library : XviD 1.1.2 (UTC 2006-11-01)
Audio #1
ID : 1
Format : MPEG Audio
Format version : Version 1
Format profile : Layer 3
Mode : Joint stereo
Mode extension : MS Stereo
Codec ID : 55
Codec ID/Hint : MP3
Duration : 44 min 10 s
Bit rate mode : Constant
Bit rate : 128 kb/s
Channel(s) : 2 channels
Sampling rate : 48.0 kHz
Compression mode : Lossy
Stream size : 40.4 MiB (10%)
Alignment : Aligned on interleaves
Interleave, duration : 42 ms (1.00 video frame)
Interleave, preload duration : 504 ms
Audio #2
ID : 2
Format : MPEG Audio
Format version : Version 1
Format profile : Layer 3
Mode : Joint stereo
Mode extension : MS Stereo
Codec ID : 55
Codec ID/Hint : MP3
Duration : 44 min 10 s
Bit rate mode : Constant
Bit rate : 128 kb/s
Channel(s) : 2 channels
Sampling rate : 48.0 kHz
Compression mode : Lossy
Stream size : 40.4 MiB (10%)
Alignment : Aligned on interleaves
Interleave, duration : 42 ms (1.00 video frame)
Interleave, preload duration : 504 ms
master65
И что интересного было в файлах?
KVL01
Всё же лучше смотреть на сигнатуры, которые есть в начале практически любого бинарника, а расширения нередко врут. Зная сигнатуры можно даже «взламывать» некоторые «архивы», просто выдирая из них куски от одной сигнатуры до следующей и сохраняя их в отдельные файлы.
AntonCheloshkin
да, но это к программистам.
тулза слеплена да 10 минут на коленке
чуть изменил ее, использую не -formats, а -decoders
KVL01
Если не нужна массовая обработка, достаточно посмотреть на файл хоть в стандартном блокноте и не писать/использовать никаких инструментов. А так да, вполне годное решение за разумное время, сам люблю на AHK завернуть что-нибудь этакое.