我使用的是 Arch Linux 4.13.10,我想合并.MOV
用佳能 EOS 相机拍摄的多个文件。
我尝试使用 FFmpeg 将文件转换为传输流(.ts
文件),如下所示这里,但生成的文件中缺少声音。
我希望生成的文件是这样的.mp4
,但这并不是严格要求的。
我该怎么做呢?
答案1
我成功使用合并文件FFmpeg 的解复用功能。为了.mp4
进行转换,我必须明确转换音频流以避免出现此错误:
在流 #1 中找不到编解码器 pcm_s16le 的标签,容器中当前不支持编解码器
这是将文件合并到以下命令merged.mp4
:
ffmpeg -f concat -i files_to_combine.txt -vcodec copy -acodec aac -strict -2 -b:a 384k merged.mp4
如果输出文件也可以是.MOV
文件,则命令为:
ffmpeg -f concat -i files_to_combine.txt -vcodec copy -acodec copy merged.MOV
以下是文本文件的内容files_to_combine.txt
:
file ./first_file.MOV
file ./second_file.MOV
如果你收到错误
不安全的文件名‘带有空格的文件.mov’files_to_combine.txt:操作不允许
并信任文件名,您可以添加-safe 0
以解决此错误。请参阅 FFmpeg 的手册页:
ffmpeg -safe 0 -f concat ...
较短的命令
五年后,我再次尝试同样的任务,也成功了
ffmpeg -f concat -i files_to_combine.txt merged.mov
和
ffmpeg -f concat -i files_to_combine.txt -f mp4 merged.mp4
答案2
find *.MOV | sed 's:\ :\\\ :g'| sed 's/^/file /' > fl.txt; ffmpeg -f concat -i fl.txt -c copy output.mp4; rm fl.txt
答案3
如果您正在寻找如何连接.mp4
文件,请参阅我的其他答案:Stack Overflow:如何使用 FFmpeg 连接两个 MP4 文件?
将多个.mov
或.MOV
文件合并为一个
...您需要执行以下操作:
# 0. Copy all .mov files that (you'd like to combine) into a single directory.
# Then `cd` into that directory.
# 1. Create a "files.txt" file containing a list of files to combine
find . -type f -iname "*.mov" | sort -V \
| awk '{print "file \x27" $0 "\x27"}' > files.txt
# [WHAT I USUALLY USE: FAST]
# 2. **If all of your .mov files have the same encoding** (ex: they were
# all recorded on the same video camera and with the same settings), you can
# specify to use the "copy" codec via `-c copy`, which means it will NOT
# have to re-encode the video. This just concatenates all the files together.
# THIS TAKES **SECONDS**.
time ffmpeg -f concat -safe 0 -i files.txt -c copy merged.mov
# [SLOW; SOMETIMES NECESSARY]
# OR 2. **If each of your .mov files has a different encoding,** you'll need to
# re-encode them all into a single stream.
# - This uses the "files.txt" file created above, and outputs the merged
# file into "merged.mov".
# THIS COULD TAKE **HOURS**.
time ffmpeg -f concat -safe 0 -i files.txt merged.mov
我通常可以使用第一个选项,它需要秒代替小时,太棒了!
额外的细节和解释
如果
ls -1
显示您有这些文件:REC_0009.MOV REC_0010.MOV REC_0011.MOV
然后该
find
命令将生成此files.txt
文件:file './REC_0009.MOV' file './REC_0010.MOV' file './REC_0011.MOV'
该
-iname "*.mov"
部分做了一个案例在.mov
senstive* 匹配以或结尾的所有文件.MOV
,或者任何其他大写字母组合。如果您忘记了
-safe 0
命令ffmpeg
,并且您的任何文件名中甚至包含“目录”形式./
,那么您将收到如下错误:[concat @ 0x555a24968700] Unsafe file name './REC_0009.MOV' files.txt: Operation not permitted
该
-safe 0
选项告诉ffmpeg
忽略此错误并接受文件路径中的“不安全”目录。来自
ffmpeg
手册页仅在线(不是在我的 Linux Ubuntu 20.04 计算机上本地的手册页中man ffmpeg
):https://manpages.org/ffmpeg:safe
如果设置为
1
,则拒绝不安全的文件路径。如果文件路径不包含协议规范且是相对的,并且所有组件仅包含可移植字符集中的字符(字母、数字、句点、下划线和连字符),并且组件开头没有句点,则认为文件路径是安全的。如果设置为
0
,则接受任何文件名。默认值为
1
。-1
相当于1
如果格式被自动探测则0
不然。该
-c copy
选项指示ffmpeg
使用“复制”编解码器,这意味着它不会重新编码视频。这就是它如此之快的原因。
参考
- 我学@Matthias Braun 的回答也是如此。
- 我的答案在这里,我用它来
\x27
制作'
角色:Stack Overflow:如何在单引号字符串中转义单引号 - 在弄清楚上述命令的细微差别时,我在 VSCode 文本编辑器中与 GitHub Copilot AI 进行了多次讨论。
- 我对 MP4 文件的回答是:Stack Overflow:如何使用 FFmpeg 连接两个 MP4 文件?