Понадобилось мне скачать видео с YouTube, вырезать от туда кусок и загрузить себе…
Загрузить видео с Youtube помог Download Master, к слову, у товарищей с Вестбайт раньше были серьёзные проблемы с этим, но они их успешно решили, за что большое спасибо.
Я терпеть не могу всякие «суперпроги», которые созданы для сбора денег и так далее, у нас есть замечательный VirtualDub, который хоть и закончился в 2013 году, но до сих пор актуален. К слову, VirtualDub поддерживает кучу расширений, сторонних рендеров, и прочее, и прочее, и прочее.
И так, приступим.
Изначально VirtualDub не умеет не открывать, не сохранять MP4. Давайте научим его!
Скачиваем последнюю версию VirtualDub
Скачиваем FFMpeg Input Plugin (любой на выбор):
Virtualdub FFMpeg Plugin v1.9.0.5 (X86_X64) (я использую этот)
Virtualdub FFMpeg Plugin v2.0.0.0 (X86_X64)
Скачиваем Zeranoe FFmpeg Encoder (разработка прекращена 18 сентября 2020 года, последняя версия за 31 августа 2020 года):
FFmpeg latest (win64) shared|static
FFmpeg v4.3.1 (win64) shared|static
FFmpeg v4.2.3 (win64) shared|static
FFmpeg v3.4.2 (win64) shared|static
FFmpeg latest (win32) shared|static
FFmpeg v4.3.1 (win32) shared|static
FFmpeg v4.2.3 (win32) shared|static
FFmpeg v3.4.2 (win32) shared|static
Разница между Общей/Статической заключается в том, что в статической все компоненты включены в один исполняемый файл, который устанавливает всё необходимое. Общие сборки содержат все компоненты и библиотеки отдельно, предназначены для разработчиков. Лично у меня установлена статическая 4.2.3b.
FFMpegInputPlugin (в зависимости от скачанной версии) нужно распаковать в папку расширений VirtualDub (это plugins32
или plugins64
в зависимости от разрядности), либо просто установить. Расширение без проблем умеет импортировать видео в разрешении максимум 720p, что больше — чревато большими проблемами, зависаниями или прочими неприятностями, вплоть до вылета самого VirtualDub. Здесь всё просто, расширение интегрируется даже в диалог открытия файлов или просто можно перетащить желаемый файл в окно VirtualDub.
С экспортом посложнее.
Устанавливаем Zeranoe FFmpeg Encoder. Теперь нужно научить VirtualDub с ним работать. Решение из Интернета выглядит так:
- Создаём файл
ffmpeg-1.vdprof
- Вписываем содержимое:
{ "description": "VirtualDub external encoder profile collection", "externalEncoders": { "sets": { "mov ff x264 r18+pcm": { "videoEncoder": "V ff 264 r18", "audioEncoder": "A ff pcm", "multiplexer": "M ff mov", "description": "mov", "extension": "mov", "processPartial": true, "useOutputAsTemp": false }, "mp4 ff mpeg4 q1+ac3": { "videoEncoder": "V ff mpeg4 q1", "audioEncoder": "A ff ac3 192k", "multiplexer": "M ff mov", "description": "mp4", "extension": "mp4", "processPartial": true, "useOutputAsTemp": false }, "mov ff mjpeg+pcm": { "videoEncoder": "V ff mjpeg q1", "audioEncoder": "A ff pcm", "multiplexer": "M ff mov", "description": "mov", "extension": "mov", "processPartial": true, "useOutputAsTemp": false } }, "profiles": { "M ff mov": { "name": "M ff mov", "program": "C:\\Program Files\\ffmpeg\\bin\\ffmpeg.exe", "commandArguments": "-i \"%(tempvideofile)\" -i \"%(tempaudiofile)\" -c:v copy -c:a copy -r %(fps) -f mov \"%(outputname)\"", "outputFilename": "%(outputname).audio", "type": 2, "inputFormat": 0, "checkReturnCode": true, "logStdout": true, "logStderr": true, "bypassCompression": false, "predeleteOutputFile": true }, "V ff 264 r18": { "name": "V ff 264 r18", "program": "C:\\Program Files\\ffmpeg\\bin\\ffmpeg.exe", "commandArguments": "-f rawvideo -s %(width)x%(height) -r %(fps) -i - -vcodec libx264 -pix_fmt yuv420p -crf 18 -preset veryfast -x264opts colormatrix=bt709:vbv-maxrate=62500:vbv-bufsize=78125 \"%(tempvideofile)\"", "outputFilename": "video.mov", "type": 0, "inputFormat": 0, "checkReturnCode": true, "logStdout": true, "logStderr": true, "bypassCompression": false, "predeleteOutputFile": true }, "V ff 264 r22": { "name": "V ff 264 r22", "program": "C:\\Program Files\\ffmpeg\\bin\\ffmpeg.exe", "commandArguments": "-f rawvideo -s %(width)x%(height) -r %(fps) -i - -vcodec libx264 -pix_fmt yuv420p -crf 22 -preset medium -x264opts colormatrix=bt709:vbv-maxrate=62500:vbv-bufsize=78125 \"%(tempvideofile)\"", "outputFilename": "video.mov", "type": 0, "inputFormat": 0, "checkReturnCode": true, "logStdout": true, "logStderr": true, "bypassCompression": false, "predeleteOutputFile": true }, "A ff pcm": { "name": "A ff pcm", "program": "C:\\Program Files\\ffmpeg\\bin\\ffmpeg.exe", "commandArguments": "-i - -vn -c:a pcm_s16le -f wav \"%(tempaudiofile)\"", "outputFilename": "%(outputname).wav", "type": 1, "inputFormat": 1, "checkReturnCode": true, "logStdout": true, "logStderr": true, "bypassCompression": true, "predeleteOutputFile": true }, "V ff mpeg4 q1": { "name": "V ff mpeg4 q1", "program": "C:\\Program Files\\ffmpeg\\bin\\ffmpeg.exe", "commandArguments": "-f rawvideo -s %(width)x%(height) -r %(fps) -i - -c:v mpeg4 -q:v 1 -pix_fmt yuv420p \"%(tempvideofile)\"", "outputFilename": "video.mp4", "type": 0, "inputFormat": 0, "checkReturnCode": true, "logStdout": true, "logStderr": true, "bypassCompression": false, "predeleteOutputFile": true }, "M ff mp4": { "name": "M ff mp4", "program": "C:\\Program Files\\ffmpeg\\bin\\ffmpeg.exe", "commandArguments": "-i \"%(tempvideofile)\" -i \"%(tempaudiofile)\" -c:v copy -c:a copy -r %(fps) -f mp4 \"%(outputname)\"", "outputFilename": "%(outputname).audio", "type": 2, "inputFormat": 0, "checkReturnCode": true, "logStdout": true, "logStderr": false, "bypassCompression": false, "predeleteOutputFile": false }, "M ff avi": { "name": "M ff avi", "program": "C:\\Program Files\\ffmpeg\\bin\\ffmpeg.exe", "commandArguments": "-i \"%(tempvideofile)\" -i \"%(tempaudiofile)\" -c:v copy -c:a copy -r %(fps) -f avi \"%(outputname)\"", "outputFilename": "%(outputname).audio", "type": 2, "inputFormat": 0, "checkReturnCode": true, "logStdout": true, "logStderr": true, "bypassCompression": false, "predeleteOutputFile": true }, "A ff ac3 192k": { "name": "A ff ac3 192k", "program": "C:\\Program Files\\ffmpeg\\bin\\ffmpeg.exe", "commandArguments": "-i - -vn -f ac3 -acodec ac3 -b:a 192k -ar 48000 -ac 2 \"%(tempaudiofile)\"", "outputFilename": "%(outputname).ac3", "type": 1, "inputFormat": 1, "checkReturnCode": true, "logStdout": true, "logStderr": true, "bypassCompression": true, "predeleteOutputFile": true }, "V ff mjpeg q1": { "name": "V ff mjpeg q1", "program": "C:\\Program Files\\ffmpeg\\bin\\ffmpeg.exe", "commandArguments": "-f rawvideo -s %(width)x%(height) -r %(fps) -i - -c:v mjpeg -q:v 1 -pix_fmt yuv420p \"%(tempvideofile)\"", "outputFilename": "%(outputname).mp4", "type": 0, "inputFormat": 0, "checkReturnCode": true, "logStdout": true, "logStderr": true, "bypassCompression": false, "predeleteOutputFile": true } } } }
- Сохраняем файл (на всякий случай, ссылка)
Далее идём в Options -> External Encoders
в VirtualDub. Нажимаем Import
и выбираем наш файлик. Видим, что появились новые возможности экспорта.
Обязательно запоминаем, что использование сторонних кодеков несовместимо с функцией Direct Strem Copy
и работает только в режиме Full processing Mode
После всех необходимых мероприятий с нарезкой, чтобы сохранить готовый файл, необходимо выбрать в меню пункт File -> Export -> Using External Encoder
и выбрать предустановку. Меня интересовала на тот момент связка mpeg4 + ac3
, как по волшебству, получил желаемый MP4 файл.
К слову, если изучить файл с предустановками и почитать про возможности FFmpeg, можно добавить свои предустановки в файлик сторонних экспортёров.
Благодарю за внимание!