Вопрос или проблема
Я копирую кассеты VHS с помощью компьютера на Windows 10, используя FFPLAY/FFMPEG (устройство захвата) в пакетном файле.
FFPLAY может просматривать кассету таким образом, и это прекрасно.
FFPLAY.EXE -hide_banner -f dshow -rtbufsize 1024M -i video="Roxio Video Capture USB":audio="Line (Roxio Video Capture USB)"
А это преобразует в MP4, и это тоже отлично. [У меня были некоторые проблемы с синхронизацией, но я добавил “-async 1 -vsync 1”, и теперь все в порядке]
ffmpeg -fflags +genpts -async 1 -vsync 1 -f dshow -rtbufsize 1024M -i video="Roxio Video Capture USB":audio="Line (Roxio Video Capture USB)" -filter:v fps=29.97 -aspect 4:3 -c:v libx264 -preset ultrafast -tune zerolatency -crf 20 -pix_fmt yuv420p -c:a aac -strict -2 -ac 2 -b:a 128k -t 03:00:00 -async 1 -vsync 1 "Good Movie.MP4"
НО, есть ли возможность запустить оба процесса одновременно, чтобы я мог просматривать кассету и останавливать преобразование?
Вот пакетный файл:
@ECHO OFF
cd /d C:\Movies
Cls
@Echo.
@Echo.
@Echo.
@Echo Преобразование
title Файл Good Movie.MP4
@Echo.
FFPLAY.EXE -hide_banner -f dshow -rtbufsize 1024M -i video="Roxio Video Capture USB":audio="Line (Roxio Video Capture USB)"
@Echo.
@ping 127.0.0.1 -n 2 -w 2000 > nul
@ping 127.0.0.1 -n %1% -w 2000> nul
ffmpeg -fflags +genpts -async 1 -vsync 1 -f dshow -rtbufsize 1024M -i video="Roxio Video Capture USB":audio="Line (Roxio Video Capture USB)" -filter:v fps=29.97 -aspect 4:3 -c:v libx264 -preset ultrafast -tune zerolatency -crf 20 -pix_fmt yuv420p -c:a aac -strict -2 -ac 2 -b:a 128k -t 03:00:00 -async 1 -vsync 1 "Good Movie.MP4"
@Echo.
@Echo.
pause
Примеры, приведенные здесь, были созданы с помощью ссылок в конце этого ответа и некоторых легких тестов с другим устройством DirectShow. Возможно, их все еще нужно изменить. (К сожалению, я не обладаю тем же устройством, что и у вас).
Обратите внимание, что ^
может использоваться в пакетных файлах для разбиения длинных строк без влияния на выполнение, именно поэтому он появляется в примерах ниже.
FFmpeg поддерживает несколько выходов. Их можно добавить, просто поместив еще один выход в конец данной команды ffmpeg
.
Например, предположим, что команда:
ffmpeg -fflags +genpts -async 1 -vsync 1 -f dshow -rtbufsize 1024M ^
-i video="Roxio Video Capture USB":audio="Line (Roxio Video Capture USB)" ^
-filter:v fps=29.97 -aspect 4:3 -c:v libx264 -preset ultrafast ^
-tune zerolatency -crf 20 -pix_fmt yuv420p -c:a aac -strict -2 -ac 2 ^
-b:a 128k -t 03:00:00 -async 1 -vsync 1 "Good Movie.MP4"
Вы можете попробовать добавить, например:
-f matroska -
В качестве дополнительного выхода. Итак:
ffmpeg -fflags +genpts -async 1 -vsync 1 -f dshow -rtbufsize 1024M ^
-i video="Roxio Video Capture USB":audio="Line (Roxio Video Capture USB)" ^
-filter:v fps=29.97 -aspect 4:3 -c:v libx264 -preset ultrafast ^
-tune zerolatency -crf 20 -pix_fmt yuv420p -c:a aac -strict -2 -ac 2 ^
-b:a 128k -t 03:00:00 -async 1 -vsync 1 "Good Movie.MP4" -f matroska -
Специальный выход -
затем можно перенаправить (|
) в ffplay
и просмотреть с помощью, например:
ffplay -i -
Таким образом, финальная команда для вашего скрипта может выглядеть так:
ffmpeg -hide_banner -fflags +genpts -async 1 -vsync 1 -f dshow ^
-rtbufsize 1024M -i video="Roxio Video Capture USB":audio="Line (Roxio Video Capture USB)" ^
-filter:v fps=29.97 -aspect 4:3 -c:v libx264 -preset ultrafast ^
-tune zerolatency -crf 20 -pix_fmt yuv420p -c:a aac -strict -2 -ac 2 ^
-b:a 128k -t 03:00:00 -async 1 -vsync 1 "Good Movie.MP4" -f matroska - ^
| ffplay -hide_banner -i -
Это заменит отдельные команды ffplay
и ffmpeg
в вашем скрипте выше.
Следует учитывать, что использование, например, -f matroska
может замедлить процесс. Другим вариантом формата, который может потенциально дать лучшие результаты производительности, является rawvideo
, например:
-r 30 -pix_fmt yuv420p -f rawvideo -
Итак, например:
ffmpeg -fflags +genpts -async 1 -vsync 1 -f dshow -rtbufsize 1024M ^
-i video="Roxio Video Capture USB":audio="Line (Roxio Video Capture USB)" ^
-filter:v fps=29.97 -aspect 4:3 -c:v libx264 -preset ultrafast ^
-tune zerolatency -crf 20 -pix_fmt yuv420p -c:a aac -strict -2 -ac 2 ^
-b:a 128k -t 03:00:00 -async 1 -vsync 1 "Good Movie.MP4" ^
-r 30 -pix_fmt yuv420p -f rawvideo -
Соответствующая команда ffplay
затем может выглядеть, например, так:
ffplay -f rawvideo -pix_fmt yuv420p -video_size 1234x1234 -framerate 30 -i -
И в качестве финального примера перенаправления:
ffmpeg -hide_banner -fflags +genpts -async 1 -vsync 1 -f dshow ^
-rtbufsize 1024M -i video="Roxio Video Capture USB":audio="Line (Roxio Video Capture USB)" ^
-filter:v fps=29.97 -aspect 4:3 -c:v libx264 -preset ultrafast ^
-tune zerolatency -crf 20 -pix_fmt yuv420p -c:a aac -strict -2 -ac 2 ^
-b:a 128k -t 03:00:00 -async 1 -vsync 1 "Good Movie.MP4" -r 30 ^
-pix_fmt yuv420p -f rawvideo - | ffplay -hide_banner -f rawvideo ^
-pix_fmt yuv420p -video_size 1234x1234 -framerate 30 -i -
Имейте в виду, что, например, -video_size 1234x1234
в ffplay
(выше) – это просто пример. rawvideo
чувствительно к правильным значениям для правильного отображения изображения. Поэтому я бы предложил сначала попробовать разрешение видео, с которым вы работаете.
Аналогично, 30
в -r 30
и -framerate 30
– это просто примеры. Они могут работать, а могут и нет. Также параметр -r
(частота кадров на выходе) в -r 30 -pix_fmt yuv420p -f rawvideo -
не является обязательным, но, как показалось, полезен для производительности при тестировании. Возможно, вы также сможете опустить параметр -framerate
в части ffplay
, но это тоже не сработало у меня. Я бы рекомендовал оставить оба -r
и -framerate
и попытаться установить их на ту же частоту кадров, что и у вашего оригинального видео.
Я не уверен, повлияет ли -filter:v fps=29.97
на частоту кадров в данном случае, но вы можете попробовать 29.97
также.
Ссылки
-
Как я могу перенаправить вывод ffmpeg в ffplay? (Super User)
-
Создание нескольких выходов (trac.ffmpeg.org)
-
rawvideo
Формат (Официальная документация FFmpeg)
Ваш код сработал отлично! он сработал быстрее, чем если бы вы просто говорили мне, что делать. Я понимаю, что это заняло много времени, чтобы показать мне – я вам очень, очень обязан, и вот вам “Никель” большой парень <<5¢>> за помощь… Я все еще экспериментирую с тестами, но хотел бы поблагодарить вас.
Я немного изменил код; один из них – это имя видеофайла, чтобы показать дату/время, и мне нравится видеть, что FFMPEG делает во время преобразования в MP4.
Вы упоминали, что первый код может замедлить процесс, так и есть, звук немного заикается во время предпросмотра, но преобразование, кажется, в порядке.
Я попробовал второй вариант [“Good Movie.MP4” -r 30 -pix_fmt yuv420p -f rawvideo -], но он имеет проблемы, я добавил PrintScreen JPG, чтобы увидеть, что он делает?
Я не знал о ^ в пакетных файлах и о том, что FFmpeg поддерживает несколько выходов.
ошибки:
реальный временной буфер [Roxio Video Capture USB] слишком полный или почти полный (75% от размера: 1024000000 [параметр rtbufsize])! кадр пропущен!
Прошедшая длительность 0.984367 слишком велика.
Пакетный файл на данный момент…
@echo off
setlocal ENABLEDELAYEDEXPANSION
set today=!date:/=-!
set now=!time::=-!
set millis=!now:*.=!
set now=!now:.%millis%=!
echo. set str VHS-!today!_!now!.mp4
ffmpeg.exe -fflags +genpts -async 1 -vsync 1 -f dshow ^
-rtbufsize 1024M -i video=”Roxio Video Capture USB”:audio=”Line (Roxio Video Capture USB)” ^
-filter:v fps=29.97 -aspect 4:3 -c:v libx264 -preset ultrafast ^
-tune zerolatency -crf 20 -pix_fmt yuv420p -c:a aac -strict -2 -ac 2 ^
-b:a 128k -t 03:00:00 -async 1 -vsync 1 “VHS-!today!_!now!.mp4” -f matroska – | FFPLAY.EXE -hide_banner -i –
pause
Ответ или решение
Захват и Конвертация Видеопотока с Помощью FFPLAY и FFMPEG
В современных условиях оцифровка старых видеоматериалов, таких как кассеты VHS, становится все более актуальной. Для этого многие пользователи обращаются к полезным инструментам, таким как FFPLAY и FFMPEG. Данная статья подробно рассмотрит, как осуществлять захват видео и аудио с устройства, а также одновременно выводить поток в реальном времени, предоставляя при этом готовый файл для дальнейшего использования.
Инструменты: FFPLAY и FFMPEG
FFPLAY — это простой медиаплеер, основанный на FFmpeg, который позволяет воспроизводить различные форматы медиафайлов и потоков.
FFMPEG — мощный инструмент для обработки видео и аудио, который может выполнять множество операций, включая захват, конвертацию, извлечение потоков и многое другое.
Ваша Задача
Вы хотите одновременно просматривать потоковое видео с вашего устройства захвата (в данном случае — Roxio Video Capture USB) и конвертировать это видео в формат MP4.
Решение проблемы
Вам необходимо объединить команды FFPLAY и FFMPEG таким образом, чтобы один и тот же поток использовался для визуализации и записи.
Команды для заведомо успешного выполнения
Вот пример команд, которые вам необходимо внести в ваш пакетный файл:
@echo off
setlocal ENABLEDELAYEDEXPANSION
set today=!date:/=-!
set now=!time::=-!
set millis=!now:*.=!
set now=!now:.%millis%=!
set str=VHS-!today!_!now!.mp4
ffmpeg -hide_banner -fflags +genpts -async 1 -vsync 1 -f dshow ^
-rtbufsize 1024M -i video="Roxio Video Capture USB":audio="Line (Roxio Video Capture USB)" ^
-filter:v fps=29.97 -aspect 4:3 -c:v libx264 -preset ultrafast ^
-tune zerolatency -crf 20 -pix_fmt yuv420p -c:a aac -strict -2 -ac 2 ^
-b:a 128k -t 03:00:00 -async 1 -vsync 1 "!str!" -f matroska - | ffplay -hide_banner -i -
Объяснение Команд
-
Значения даты и времени: Вы устанавливаете переменные
today
иnow
, чтобы автоматически задавать имя выходного файла с текущей датой и временем. -
Основная команда FFMPEG:
-hide_banner
: отключает вывод информации об FFmpeg при запуске.-fflags +genpts
: генерирует временные метки для выходного потока.-f dshow
: указывает формат входного потока (DirectShow).-i video="Roxio Video Capture USB":audio="Line (Roxio Video Capture USB)"
: выбирает видеопоток и аудиопоток.-filter:v fps=29.97
: устанавливает частоту кадров.-c:v libx264
: задает кодек для видео.-preset ultrafast -tune zerolatency
: настройки кодирования для минимизации задержки.-b:a 128k
: задает битрейт звука.-f matroska - | ffplay -hide_banner -i -
: производит захват видео в формате Matroska и передает его напрямую на вывод через FFPLAY.
Важные Замечания
- Задержка и синхронизация: Используйте параметры
-async
и-vsync
для минимизации расхождений между видео и аудио. - Потоковое видео: Масса закладок, включая
rtbufsize
, могут быть отрегулированы в зависимости от вашей системы и соединения.
Заключение
Комбинирование FFPLAY и FFMPEG открывает множество возможностей для цифровой обработки, позволяя одновременно захватывать и просматривать контент, что делает процесс оцифровки более удобным и плодотворным. Убедитесь, что вы адаптируете команду под свои нужды и настраиваете параметры для достижения оптимальных результатов. Если у вас возникнут новые сообщения или ситуации, связанные с производительностью, продолжайте экспериментировать с настройками до тех пор, пока не найдете идеальное сочетание для вашего устройства и программного обеспечения.