gpt4 book ai didi

Bash:通过子文件夹集循环ffmpeg命令并将其定向到文件夹中的文件进行处理

转载 作者:行者123 更新时间:2023-12-04 23:05:56 30 4
gpt4 key购买 nike

我正在尝试将字幕嵌入到 mp4 视频文件中,并希望找到一种方法来跨包含 .mp4 和 .srt 文件的大型目录集执行此操作。每对 .mp4 和 .srt 文件将被放在各自的目录中,并且两者之间的基本名称应该相同。例子:

Video1
Video1.mp4
Video1.srt
Video2
Video2.mp4
Video2.srt

我尝试了几件事,但我是新手,只为更直接的过程编写非常简单的 bash 脚本。为此,我需要弄清楚如何编写 bash 脚本以在每个子文件夹中运行 ffmpeg 命令,该命令将抓取 mp4 和 srt 文件并输出合并数据的新 mp4。执行此操作的基本 ffmpeg 命令是:
ffmpeg -i filename.mp4 -i filename.srt -c copy -c:s mov_text output.mp4

我尝试添加:
for dir in ./*/; do ffmpeg -i *.mp4 -i *.srt -c copy -c:s move_text “$file”.mp4

......还有几个变体,但 ffmpeg 总是以“*.mp4:没有这样的文件或目录”错误停止。然后我尝试在“for dir in”语句之后添加“for file in...”,但没有任何积极的结果。以下内容最接近我的需要 - 它至少会转到每个文件夹并处理文件 - 但它独立完成它们并且不会像 ffmpeg 命令那样组合 mp4 和 srt 源文件。它输出 video.mp4.mp4 和 video.srt.mp4,并且在任何一种情况下都无法将它们组合起来。
for dir in ./**/*;
do ffmpeg -i "$dir" -i "$dir" -c copy -c:s mov_text "$dir".mp4

我试过 "$dir".mp4 和 "$dir".srt 但这只会导致错误。我试图只提取目录名称:
for dir in ./**/*;
do ffmpeg -i "$(basename $dir)" -i "$(basename $dir)" -c copy -c:s mov_text "$dir".mp4

我使用“$(b​​asename $dir).extension”的尝试导致了错误——它会查找 video.mp4.mp4 或 video.srt.mp4。任何有关添加什么以使此过程正常工作或完全采用其他方法的提示将不胜感激!我认为这是一个简单的 bash 事情,我只是不知道,但肯定需要学习如何去做!谢谢!

最佳答案

在包含 Video1/ 的目录中运行它, Video2/ ...

#!/bin/bash -e
shopt -s globstar
for v in ./**/*.mp4; do
s=${v%.*}.srt
if [ -f "$s" ]; then
ffmpeg -i "$v" -i "$s" -c copy -c:s mov_text "${v##*/}"
fi
done
  • ./**/*.mp4扩展到 ./Video1/Video1.mp4 ./Video1/Video2.mp4 ... ,
  • ${v%.*}删除扩展名( ./Video1/Video1.mp4 > ./Video1/Video1 ),
  • [ -f "$s" ]检查是否 $s (即 ./Video1/Video1.srt )存在,
  • ${v##*/}提取 $v 的基本名称(./Video1/Video1.mp4 > Video1.mp4)。

  • 所以 .的最终结构会像:
    Video1.mp4    # subbed
    Video1
    Video1.mp4
    Video1.srt
    Video2.mp4 # subbed
    Video2
    Video2.mp4
    Video2.srt

    关于Bash:通过子文件夹集循环ffmpeg命令并将其定向到文件夹中的文件进行处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53674724/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com