我正在尝试将字幕嵌入到mp4视频文件中,并希望找到一种方法在包含.mp4和.srt文件的大量目录中实现这一点。每对.mp4和.srt文件都将在它们自己的目录中被子折叠在一起,两者之间的basename应该是相同的。示例:
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: No这类文件或目录”错误而终止。然后我试着加入“文件.”在"for dir in“声明之后,却没有任何积极的结果。下面的内容与我所需要的最接近--它至少会访问每个文件夹并处理这些文件--但是它会独立地处理这些文件,并且不会像ffmpeg命令所应该的那样组合mp4和srt源文件。它输出一个视频.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而我使用"$(basename $dir).extension“的尝试也导致了错误--它查找的是errors .mp4.mp4或video.srt.mp4。任何关于添加什么来使这个过程工作或其他方法的提示都将是非常感谢的!我觉得这是一件简单的事情,我只是不知道,但当然需要学习如何做!谢谢!
发布于 2018-12-07 18:41:49
在包含Video1/、Video2/的dir中运行这个..。
#!/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发布于 2018-12-07 21:18:42
作为对ogizismail的出色回答的调整,下面是一种处理bash版本的方法,该方法太老了,不支持globstar
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会阻止它找到您已经下床的输出文件。
https://stackoverflow.com/questions/53674724
复制相似问题