使用 ffmpeg 合并两个视频

发布于 2024-12-06 17:25:27 字数 195 浏览 1 评论 0原文

我想使用 ffmpeg 将两个 mp4 视频组合成一个 mp4 视频。

到目前为止我尝试过的是:

ffmpeg -i input1.mp4 -i input2.mp4 output.mp4

但是,每次我使用第一个输入的视频编解码器而不是另一个输入的视频编解码器获取视频时。我怎样才能将它们结合起来?

I want to combine two mp4 videos to form a single mp4 video using ffmpeg.

what i tried so far is:

ffmpeg -i input1.mp4 -i input2.mp4 output.mp4

But, every time i get the video with video codec of first input and not the other. How can i combine them?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

甜扑 2024-12-13 17:25:27

正如前面的答案所示,您需要首先转换为中间格式。如果 mp4 包含 h264 比特流,您可以使用:

ffmpeg -i input1.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts input1.ts
ffmpeg -i input2.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts input2.ts
ffmpeg -i "concat:input1.ts|input2.ts" -c copy output.mp4

您可以在此处找到更详细的答案< /a>.

As previous answers show, you need to convert first to an intermediate format. If the mp4 contains h264 bitstream, you can use:

ffmpeg -i input1.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts input1.ts
ffmpeg -i input2.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts input2.ts
ffmpeg -i "concat:input1.ts|input2.ts" -c copy output.mp4

A more detailed answer you can find here.

不交电费瞎发啥光 2024-12-13 17:25:27

请阅读 FFMPEG 常见问题解答,了解有关加入文件的信息。

不幸的是,由于您使用的是 MP4 文件,简单的串联对您不起作用,因为 MP4 格式包含一个描述和包含偏移量的“标头”(尽管它不一定位于文件的开头)部分进入媒体数据。您需要将两个文件转码为可以串联的格式,然后从该格式生成 MP4 文件(这将生成适当的标头部分)。

Please read the FFMPEG FAQ for information about joining files.

Unfortunately, since you're using MP4 files, simple concatenation won't work for you because the MP4 format contains a "header" (although it doesn't necessarily have to be at the beginning of the file) section that describes and contains offsets into the media data. You will need to transcode both files to a format that can be concatenated and then generate an MP4 file from that format (which will generate an appropriate header section).

深居我梦 2024-12-13 17:25:27

您无法串联 .mp4 文件,但可以串联 .mpg 文件。首先尝试使用 ffmpeg 将两个视频转换为 .mpg。然后,对两个 .mpg 文件运行简单的 linux cat 命令以创建组合的 .mpg 文件。之后,使用 ffmpeg 将串联的 .mpg 文件转换为 .mp4。这是一种迂回的方法,但它确实有效。您可以使用“命名管道”来减少命令数量,但结果是相同的。

You can't concatenate .mp4 files but you can concatenate .mpg files. Try converting both videos to .mpg first using ffmpeg. Then, run a simple linux cat command on both .mpg files to create a combined .mpg file. After that, convert the concatenated .mpg file to .mp4 using ffmpeg. This is sort of a roundabout approach but it works. You can use "named pipes" to reduce the number of commands but the result is the same.

暮倦 2024-12-13 17:25:27

您可以使用 ffmpeg 来完成此操作,但还有一个小工具,称为 MP4Box(GPAC),可以连接多个 MP4 文件。

在你的情况下,语法是

MP4Box -cat input1.mp4 -cat input2.mp4 output.mp4

You can do this with ffmpeg, but there's also a little tool out there, called MP4Box (part of GPAC), that can concatenate multiple MP4 files.

In your case, the syntax is

MP4Box -cat input1.mp4 -cat input2.mp4 output.mp4
つ可否回来 2024-12-13 17:25:27

concat demuxer:快速并保持质量

如果所有输入都具有 相同的属性、格式和视频/音频流数量,则可以使用concat 解复用器。这可以让您无需重新编码即可连接,因此速度很快并且可以保持质量。

  1. 制作包含以下内容的input.txt

    文件“input1.mp4”
    文件“input2.mp4”
    
  2. 连接

    ffmpeg -f concat -i 输入.txt -c 复制输出.mp4
    

    如果出现错误不安全的文件名,请添加-safe 0 concat demuxer输入选项(在-i之前)。

如果您的输入不匹配

如果您的输入不同或任意,则:

concat demuxer: fast and preserves quality

If all of the inputs have the same attributes, formats, and number of video/audio streams, then you can use the concat demuxer. This can allow you to concatenate without needing to re-encode, so it is fast and preserves quality.

  1. Make input.txt containing the following:

    file 'input1.mp4'
    file 'input2.mp4'
    
  2. Concatenate

    ffmpeg -f concat -i input.txt -c copy output.mp4
    

    If you get error Unsafe file name add the -safe 0 concat demuxer input option (before -i).

If your inputs do not match

If your inputs are different or are arbitrary then either:

一花一树开 2024-12-13 17:25:27

这可能不是最好的解决方案,因为它会创建临时文件。但我想为人们提供一个简单的答案作为替代方案:

#!/usr/bin/env bash
# Synopsis: Combine any input videos to a mp4 file.
# Usage: ffmpeg-combine-videos input_video1 input input_video2 ...

n=0

rm -f __input*
> __input.list

for i in "$@";do
    I=__input${n}.ts
    ffmpeg -i "$i" -c:v h264 -b:v ${VIDEO_BITRATE:-400k} -c:a libmp3lame -f mpegts "$I"
    echo "file $I" >> __input.list
    n=$((n+1))
done

ffmpeg -f concat -safe 0 -i __input.list -c copy combined.mp4

rm -f __input*

This may not be the best solution, since it creates temporary file. But I would like to provide people with a straightforward answer as an alternative:

#!/usr/bin/env bash
# Synopsis: Combine any input videos to a mp4 file.
# Usage: ffmpeg-combine-videos input_video1 input input_video2 ...

n=0

rm -f __input*
> __input.list

for i in "$@";do
    I=__input${n}.ts
    ffmpeg -i "$i" -c:v h264 -b:v ${VIDEO_BITRATE:-400k} -c:a libmp3lame -f mpegts "$I"
    echo "file $I" >> __input.list
    n=$((n+1))
done

ffmpeg -f concat -safe 0 -i __input.list -c copy combined.mp4

rm -f __input*
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文