FFPLAY/FFMPEG(捕获设备)

FFPLAY/FFMPEG(捕获设备)

我正在使用批处理文件中的 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 --framerateffplay-r-framerate


我不确定-filter:v fps=29.97在这种情况下是否会影响帧速率,但你当然29.97也可以尝试。


参考

答案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 -

暂停


相关内容