我正在尝试使用 ffmpeg
合并几个 flv 文件. ffmpeg
需要这种格式的文件列表:
file '/path/to/file1'
file '/path/to/file2'
file '/path/to/file3'
通过一些搜索和试验,我想出了这个单行命令:
ffmpeg -safe 0 -f concat -i <(for entry in "$(cd "$(dirname "$1")"; pwd)/$(basename "$1")"/*.flv;do echo "file '$entry'";done) -c copy output.flv
括号中的脚本将生成当前文件夹中所有文件的路径列表,格式为
ffmpeg
所需的格式。 :for entry in "$(cd "$(dirname "$1")"; pwd)/$(basename "$1")"/*.flv;do echo "file '$entry'";done
但是,这仅按字母数字顺序列出文件:
6846641-10.flv
6846641-11.flv
6846641-12.flv
6846641-13.flv
6846641-14.flv
6846641-15.flv
6846641-16.flv
6846641-17.flv
6846641-18.flv
6846641-19.flv
6846641-1.flv
6846641-20.flv
6846641-21.flv
6846641-22.flv
6846641-23.flv
6846641-24.flv
6846641-2.flv
6846641-3.flv
6846641-4.flv
6846641-5.flv
6846641-6.flv
6846641-7.flv
6846641-8.flv
6846641-9.flv
要正确合并视频,我需要按自然顺序列出文件,如下所示:
自然排序的文件
如图,文件需要按
-
后面的数字排序从 1 到 24,与 6846641-1.flv
在第一行和 6846641-24.flv
在最后一行。格式如下:file '/mnt/c/Users/Oho/Desktop/save//6846641-xx.flv'
是否可以为
ffmpeg
生成格式正确的列表?使用 bash 脚本(如果可以的话,在一行中)?编辑:
感谢 Cyrus,修改后的代码就在这里,它可以完成工作:
#!/bin/bash
for entry in "$(cd "$(dirname "$1")"; pwd)/$(basename "$1")"/*.flv
do
echo "file '$entry'" >> fileOutputList.temp
done
sort -t "-" -n -k 2 fileOutputList.temp > fileOutputListSorted.temp
ffmpeg -safe 0 -f concat -i fileOutputListSorted.temp -c copy output.flv
rm fileOutputList.temp
rm fileOutputListSorted.temp
最佳答案
我建议:
sort -t "-" -n -k 2 file
-t "-"
: use-
as separator
-n
: compare according to string numerical value
-k2,2
: start a key at column 2
关于bash - 使用 bash 脚本以自然顺序列出文件夹中的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41659018/