较短的命令

较短的命令

我使用的是 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"部分做了一个案例.movsenstive* 匹配以或结尾的所有文件.MOV,或者任何其他大写字母组合。

  • 如果您忘记了-safe 0命令ffmpeg,并且您的任何文件名中甚至包含“目录”形式./,那么您将收到如下错误:

    [concat @ 0x555a24968700] Unsafe file name './REC_0009.MOV'
    files.txt: Operation not permitted
    

    -safe 0选项告诉ffmpeg忽略此错误并接受文件路径中的“不安全”目录。

    @Matthias Braun 在这里提到了这一点。

    来自ffmpeg手册页仅在线不是在我的 Linux Ubuntu 20.04 计算机上本地的手册页中man ffmpeg):https://manpages.org/ffmpeg

    safe

    如果设置为1,则拒绝不安全的文件路径。如果文件路径不包含协议规范且是相对的,并且所有组件仅包含可移植字符集中的字符(字母、数字、句点、下划线和连字符),并且组件开头没有句点,则认为文件路径是安全的。

    如果设置为0,则接受任何文件名。

    默认值为1

    -1相当于1如果格式被自动探测则0不然。

  • -c copy选项指示ffmpeg使用“复制”编解码器,这意味着它不会重新编码视频。这就是它如此之快的原因。

参考

  1. 我学@Matthias Braun 的回答也是如此
  2. 我的答案在这里,我用它来\x27制作'角色:Stack Overflow:如何在单引号字符串中转义单引号
  3. 在弄清楚上述命令的细微差别时,我在 VSCode 文本编辑器中与 GitHub Copilot AI 进行了多次讨论。
  4. 我对 MP4 文件的回答是:Stack Overflow:如何使用 FFmpeg 连接两个 MP4 文件?

相关内容