首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Bash:通过一组子文件夹循环ffmpeg命令,并将其定向到文件夹中的文件以进行处理。

Bash:通过一组子文件夹循环ffmpeg命令,并将其定向到文件夹中的文件以进行处理。
EN

Stack Overflow用户
提问于 2018-12-07 18:00:13
回答 2查看 1.4K关注 0票数 0

我正在尝试将字幕嵌入到mp4视频文件中,并希望找到一种方法在包含.mp4和.srt文件的大量目录中实现这一点。每对.mp4和.srt文件都将在它们自己的目录中被子折叠在一起,两者之间的basename应该是相同的。示例:

代码语言:javascript
复制
Video1
  Video1.mp4
  Video1.srt
Video2
  Video2.mp4
  Video2.srt

我尝试过几种方法,但我在这方面还是新手,我只为更简单的过程编写非常简单的bash脚本。为此,我需要弄清楚如何编写bash脚本,以便在每个子文件夹中运行ffmpeg命令,以获取mp4和srt文件,并输出合并数据的新mp4。执行此操作的基本ffmpeg命令是:

代码语言:javascript
复制
ffmpeg -i filename.mp4 -i filename.srt -c copy -c:s mov_text output.mp4

我试着补充:

代码语言:javascript
复制
for dir in ./*/; do ffmpeg -i *.mp4 -i *.srt -c copy -c:s move_text “$file”.mp4

…并且有几个变体,但是ffmpeg总是以一个“*.mp4: No这类文件或目录”错误而终止。然后我试着加入“文件.”在"for dir in“声明之后,却没有任何积极的结果。下面的内容与我所需要的最接近--它至少会访问每个文件夹并处理这些文件--但是它会独立地处理这些文件,并且不会像ffmpeg命令所应该的那样组合mp4和srt源文件。它输出一个视频.mp4.mp4和video.srt.mp4,并在任何一种情况下都不能将它们结合起来。

代码语言:javascript
复制
for dir in ./**/*;
do ffmpeg -i "$dir" -i "$dir" -c copy -c:s mov_text "$dir".mp4

我尝试了"$dir".mp4和"$dir".srt,但这只会导致一个错误。我试图只提取目录名:

代码语言:javascript
复制
for dir in ./**/*;
do ffmpeg -i "$(basename $dir)" -i "$(basename $dir)" -c copy -c:s mov_text "$dir".mp4

而我使用"$(basename $dir).extension“的尝试也导致了错误--它查找的是errors .mp4.mp4或video.srt.mp4。任何关于添加什么来使这个过程工作或其他方法的提示都将是非常感谢的!我觉得这是一件简单的事情,我只是不知道,但当然需要学习如何做!谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-12-07 18:41:49

在包含Video1/Video2/的dir中运行这个..。

代码语言:javascript
复制
#!/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)。

因此,.的最终结构如下:

代码语言:javascript
复制
Video1.mp4    # subbed
Video1
  Video1.mp4
  Video1.srt
Video2.mp4    # subbed
Video2
  Video2.mp4
  Video2.srt
票数 2
EN

Stack Overflow用户

发布于 2018-12-07 21:18:42

作为对ogizismail的出色回答的调整,下面是一种处理bash版本的方法,该方法太老了,不支持globstar

代码语言:javascript
复制
while IFS= read -r -d '' v; do
  s=${v%.mp4}.srt
  [[ -e $s ]] && ffmpeg -i "$v" -i "$s" -c copy -c:s mov_text "${v##*/}"
done < <(find . -mindepth 2 -name '*.mp4' -printf '%P\0')

使用查找中讨论了一般的技术。使用-mindepth 2会阻止它找到您已经下床的输出文件。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53674724

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档