我正在使用批处理文件中的 FFPLAY/FFMPEG(捕获设备)通过 Windows 10 计算机复制一些 VHS 磁带。
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 Converting
title File 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
答案1
这里给出的示例是使用本答案末尾的参考资料和使用另一台 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 -
-
然后可以通过管道 ( |
)将特殊输出传送至fflpay
并使用以下方式查看:
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
需要注意的是,使用 eg-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
中的 s只是示例。它们可能对您有用,也可能没用。此外,中的选项(输出帧速率)不是必需的,但它似乎有助于提高测试期间的性能。您也可以省略部分中的选项,但这对我来说也不太好。我会考虑保留和并尝试将它们设置为与原始视频相同的帧速率。-r 30
-framerate 30
-r
-r 30 -pix_fmt yuv420p -f rawvideo -
-framerate
ffplay
-r
-framerate
我不确定-filter:v fps=29.97
在这种情况下是否会影响帧速率,但你当然29.97
也可以尝试。
参考
创建多个输出(trac.ffmpeg.org)
rawvideo
格式(FFmpeg 官方文档)
答案2
您的代码运行得很好! 它比你告诉我该怎么做更快。我知道它花了很多时间向我展示——我真的真的欠你,这里有一个“Nickle”大个子<<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
设置今天=!日期:/=-!设置现在=!时间::=-!设置毫秒=!现在:*.=!设置现在=!现在:.%毫秒%=!
回声。设置 str VHS-!今天!_!现在!.mp4
ffmpeg.exe -fflags +genpts -async 1 -vsync 1 -f dshow ^ -rtbufsize 1024M -i video="Roxio 视频捕获 USB":audio="线路 (Roxio 视频捕获 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 -
暂停