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

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

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

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

Так, у меня все получилось, за пол-часа у меня уже была кучка файлов, с которыми я уже смог поработать.
Поделиться с друзьями
-->

Комментарии (7)


  1. tsklab
    18.04.2017 13:52
    +1

    А чем вам не угодил MediaInfo, ставший стандартом де-факто?


    1. AntonCheloshkin
      18.04.2017 13:58
      +1

      вот поэтому
      General
      Complete name: tmp\in.wav
      File size: 1.21 GiB
      eof


      1. tsklab
        24.04.2017 21:29

        Вы что-то готовить не умеете
        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


  1. master65
    18.04.2017 14:17
    +3

    И что интересного было в файлах?


  1. KVL01
    19.04.2017 13:30
    +1

    Всё же лучше смотреть на сигнатуры, которые есть в начале практически любого бинарника, а расширения нередко врут. Зная сигнатуры можно даже «взламывать» некоторые «архивы», просто выдирая из них куски от одной сигнатуры до следующей и сохраняя их в отдельные файлы.


    1. AntonCheloshkin
      19.04.2017 14:09

      да, но это к программистам.
      тулза слеплена да 10 минут на коленке
      чуть изменил ее, использую не -formats, а -decoders


      1. KVL01
        19.04.2017 14:57

        Если не нужна массовая обработка, достаточно посмотреть на файл хоть в стандартном блокноте и не писать/использовать никаких инструментов. А так да, вполне годное решение за разумное время, сам люблю на AHK завернуть что-нибудь этакое.