2

我正在一块一块地处理视频,用文件名保存scene1.aviscene2.avi等等。

我想要一种简单的方法将视频构建成一个块并在音轨中配音。为此,我使用了 VirtualDub。

现在,我可以很简单地打开 VirtualDub,通过 File => Open,加载第一个场景,转到 File => Append video segment,选择第二个场景,选中“autodetect additional segments by filename”选项,设置视频到直接流复制,将音频设置为“来自其他文件”并选择音轨,然后将整个内容另存为out.avi......但只需四行即可解释所有内容!

我想要一个 VCF 脚本来一起构建所有这些文件。不幸的是,编码语言很烂。

我不知道我在创建这种脚本语言时在想什么。它非常松散地基于 C,但它更糟糕。在我创作它之前,我一定一直在看泡泡糖危机。
所有语句要么是声明,要么是表达式,并且所有语句都必须以分号结尾。没有流控制——没有函数,没有过程,没有if,没有while,没有for,没有switch,没有goto。

if,不while,不for……所以我想while file exists("scene"+i+".avi") {VirtualDub.Append("scene"+i+".avi"); i++;}这是完全不可能的。

我正在使用批处理脚本来检查 VCF 文件是否存在并使用正确的命令行运行 VirtualDub 来运行脚本,所以也许我可以使用该脚本来“构建”包含所有所需的 VCF 文件文件?有什么方法可以自动检测 VCF 文件中的段,还是我必须使用批处理脚本自定义构建 VCF?

4

2 回答 2

2

在研究了做非常相似的事情的方法后,我刚刚遇到了这个问题。在我看来,最好的办法是编写一个小脚本或程序,生成一个 VirtualDub 脚本文件以供一次性使用,然后执行它。

例如,我手写了以下脚本来将三个 .avi 文件连接在一起:

// Set Video and Audio to Direct Stream Copy
VirtualDub.video.SetMode(0);
VirtualDub.audio.SetMode(0);

VirtualDub.Open(U"D:\path\to\file1.avi");
VirtualDub.Append(U"D:\path\to\file2.avi");
VirtualDub.Append(U"D:\path\to\file3.avi");

VirtualDub.SaveAVI(U"D:\path\to\concatenatedFile.avi");
VirtualDub.Close();

您可以将其用作模板并从那里开始。

于 2014-02-23T20:28:20.843 回答
1

我刚刚写了一些相关/类似的东西,应该让你开始编码。它是一个批处理文件,因此将以下内容复制到 something.bat:

Set Mfps=23.976
Set Bpath="E:\- Video Extractions\Virtualdub\1920x1280 (23.976fps pure,93%%,MPEG2,deinterlaced)auto openNsave.vcf"
rem Set Bpath="E:\- Video Extractions\Virtualdub\852x480 DAR3 (16x9) (24fps,96%%,MPEG2,deinterlaced).vcf"
Set Vdpath="E:\- Video Extractions\Virtualdub\VirtualDub-1.8.8\"
Set Svpath="D:\"
for %%A in (*.mkv *.avi *.mpg *.mpeg *.m2ts *.vob) do >%%~nA.avs echo # M2ts file & >>%%~nA.avs echo SetMemoryMax(128) & >>%%~nA.avs echo DirectShowSource("%%~dA%%~pA%%~nA%%~xA", fps=%Mfps%, audio=true, seekzero = true, convertfps=true) & >>%%~nA.avs echo EnsureVBRMP3Sync() & start /d %Vdpath% VirtualDub.exe /i %Bpath% "%%~dA%%~pA%%~nA.avs" "%Svpath%%%~nA.avi"
rem ---Notes---
rem code requires: Avisynth, virtualdub, pre-existing (.vcf) config file
rem most people prefer to use virtualdub with jobs in queue; run them in sequence. This runs jobs in parallel by searching the directory of the script, finding all listed wildcard masked files below, generating a simple avisynth script file for each file, then opening virtualdub and autosaving the video to .avi
rem caution, this will stress your system. you may only be able to handle 1 file at a time. I can input 30 blueray .m2ts files just fine, so long as i set vdub process to idle or low. Modify the code to your hearts content  ~  TigerWild
rem create a unique .vcf that you will use with this batch file only. Do this by running Virtualdub, opening a video file, configuring all your settings as you want them, then selecting File->save processing settings->.vcf
rem use a text editor to open the vcf file you made, and add these 2 lines:      VirtualDub.Open(VirtualDub.params[0]); VirtualDub.SaveAVI(VirtualDub.params[1]);
rem ---References---
rem http://stackoverflow.com/questions/8749637/dos-command-to-sperate-file-name-and-extension-into-variables
rem http://forum.doom9.org/archive/index.php/t-152842.html     with a nod to stax76
于 2013-05-16T00:26:47.300 回答