批量使用ffmpeg时如何使用临时文件并替换输入?

Posted

技术标签:

【中文标题】批量使用ffmpeg时如何使用临时文件并替换输入?【英文标题】:How to use temporary files and replace the input when using ffmpeg in batch? 【发布时间】:2020-06-15 22:46:01 【问题描述】:

到目前为止我做了什么:

我通过this answer 了解到,我可以使用negative mapping 从我的视频文件中删除不需要的流(额外的音频、字幕)。

他们继续使用 Windows cmd 上的简单 for /r 循环将其应用于文件夹中的几十个文件。由于我认为这个过程是某种修剪,所以我并不关心我的原始文件并希望 ffmpeg 替换它们,这当然不能。

我尝试进一步搜索并找到解决此问题的方法,而不是简单地使用新目标,然后手动替换文件,但没有运气。

然而,我的很多发现似乎表明 ffmpeg 能够使用外部临时文件来实现它的某些功能,尽管我真的找不到更多关于它的信息。

我想做什么:

那么有什么方法可以让 ffmpeg 删除那些额外的流并以某种方式替换原始文件。我还需要将它用于多个文件,因为我认为这不是一个大问题......

我真的需要用 ffmpeg 来完成这项工作,因为全面学习该工具是我的长期目标,我想继续沿着这条曲线工作,但至于批处理/cmd,我更喜欢它,因为我还没有正确地学习一门编程语言(即使我经常插手一些),但我很乐意使用任何类型的建议来处理 ffmpeg!

谢谢!

【问题讨论】:

就目前而言,您的问题是题外话。请拨打tour。学习How to Ask,也请阅读minimal reproducible example。 我重读了那些,但我仍然不明白为什么它离题了。我没有发布我目前使用的内容,因为它甚至不应该是一个部分解决方案,我的问题集中在什么是 ffmpeg 的中心“限制”以及解决它的方法上。不过,我之前的写作可能令人困惑,如果有,请告诉我。我目前使用的代码是for /r %i in (*) do ffmpeg -i "%~fi" -map 0 -map -0:a:2 -c copy D:\Folder\%~i 【参考方案1】:

单独使用ffmpeg 是不可能的

ffmpeg 无法就地更改文件。

输出必须是一个新文件。

但是,在您的批处理脚本中,用新文件删除/删除/替换到原始文件应该是微不足道的。

我在搜索时看到了一些模糊的引用,还偶然发现了缓存协议和-hls_flags temp_file

cache protocol 允许在实时输入回放期间进行一些有限的搜索。 -hls_flags temp_file 只能与 HLS muxer 一起使用,并创建一个名为 filename.tmp 的文件,然后在活动段完成后重命名该文件。两者都不能用于您想做的事情。

【讨论】:

嗯,这就是我想要的帮助...如果可以使用 ffmpeg 的临时文件功能,我相信这将是最经济的方式。 @FabioFreitas “ffmpeg 的临时文件功能”是什么意思? 如果它没有给你敲响警钟,那很可能是我弄错了。我在搜索时看到了一些模糊的参考资料,并且在文档中偶然发现了these 两个entries。但是如果我在这里找不到完美解释的答案,我仍然不明白 ffmpeg,这就是为什么我做出如此模糊的假设。 @FabioFreitas 缓存协议允许在实时输入回放期间进行一些有限的搜索。 -hls_flags temp_file 仅可用于 HLS 多路复用器,并创建一个名为 filename.tmp 的文件,然后在活动段完成后重命名该文件。两者都不能用于您想做的事情。你只需要输出到一个新文件,然后替换旧文件。 好的,这样就解决了,谢谢。您能否将此信息添加到您的答案中?

以上是关于批量使用ffmpeg时如何使用临时文件并替换输入?的主要内容,如果未能解决你的问题,请参考以下文章

FFmpeg滤镜(1)

适用于 Windows 的 FFMPEG 批量转换 [重复]

word 如何批量替换

使用 ffmpeg 批量降低 mp3 音频文件的比特率和大小

使用 FFMPEG 批量删除音频结尾

如何使用 bash 命令或 Ruby 使用 ffmpeg 将 mp4 文件批量转换为 ogg