当前位置: 首页 > 知识库问答 >
问题:

FFMPEG:向视频文件添加额外的音轨

仲孙才捷
2023-03-14

我有两个视频文件,具有以下流:


文件1:

Stream #0:0(deu): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 126 kb/s (default)
Stream #0:1(deu): Audio: ac3 (ac-3 / 0x332D6361), 48000 Hz, 5.1(side), fltp, 384 kb/s
Stream #0:2(eng): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709), 1920x1080 [SAR 1:1 DAR 16:9], 4971 kb/s, 23.98 fps, 23.98 tbr, 2997 tbn, 5994 tbc (default)
Stream #0:3: Video: mjpeg, yuvj420p(pc, bt470bg/unknown/unknown), 480x480 [SAR 72:72 DAR 1:1], 90k tbr, 90k tbn, 90k tbc

文件2:

Stream #0:0(eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 126 kb/s (default)
Stream #0:1(eng): Audio: ac3 (ac-3 / 0x332D6361), 48000 Hz, 5.1(side), fltp, 384 kb/s
Stream #0:2(eng): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709), 1920x1080 [SAR 1:1 DAR 16:9], 4925 kb/s, 23.98 fps, 23.98 tbr, 23976 tbn, 47952 tbc (default)
Stream #0:3(eng): Subtitle: eia_608 (c608 / 0x38303663), 1920x1080, 0 kb/s
Stream #0:4: Video: mjpeg, yuvj420p(pc, bt470bg/unknown/unknown), 480x480 [SAR 72:72 DAR 1:1], 90k tbr, 90k tbn, 90k tbc


两个文件都有完全相同的视频内容,但第一个视频有德语音轨,第二个视频有英语音轨。

如何从德语视频文件中提取音轨并将其添加到英语视频文件中,而不丢失英语字幕,并能够在媒体播放器中在这些音轨之间进行选择?

我对此进行了搜索,我找到了类似问题的多个答案,但都不起作用:有些只包含一个音轨,有些同时播放两个音轨。

我不确定这个问题是否应该在Super User上提出,但由于有很多关于ffmpeg关于堆栈溢出的问题,我在这里提出了这个问题。

共有1个答案

轩辕炎彬
2023-03-14

需要注意的是,FFmpeg不能添加到文件中,它必须创建一个新文件,其中包含流、设置和元数据。这使得它成为一个很好的解决问题的程序,创建一个新的文件不是一个问题。

ffmpeg -i FILE1 \
     -i FILE2 \
     -map 1:2 -map 1:0 -map 1:1 -map 0:0 -map 0:1 -map 1:3 -map 1:4 \
     -c copy \
     -disposition:a -default -disposition:a:0 default \
     -disposition:v -default -disposition:v:0 default \
     OUTPUT

有关上面命令的信息可以在FFmpeg文档5.4主要选项和5.11高级选项中找到。

结果输出文件将有如下映射的流:

Stream #0:0(eng): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709), 1920x1080 [SAR 1:1 DAR 16:9], 4925 kb/s, 23.98 fps, 23.98 tbr, 23976 tbn, 47952 tbc (default)
Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 126 kb/s (default)
Stream #0:2(eng): Audio: ac3 (ac-3 / 0x332D6361), 48000 Hz, 5.1(side), fltp, 384 kb/s
Stream #0:3(deu): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 126 kb/s
Stream #0:4(deu): Audio: ac3 (ac-3 / 0x332D6361), 48000 Hz, 5.1(side), fltp, 384 kb/s
Stream #0:5(eng): Subtitle: eia_608 (c608 / 0x38303663), 1920x1080, 0 kb/s (default)
Stream #0:6: Video: mjpeg, yuvj420p(pc, bt470bg/unknown/unknown), 480x480 [SAR 72:72 DAR 1:1], 90k tbr, 90k tbn, 90k tbc
 类似资料:
  • 但是我将ffmpeg更新到了最新版本(ffmpeg version git-2012-06-16-809d71d),现在在这个版本中参数不起作用。 请告诉我如何使用将新音频添加到视频(不是混合)中。

  • 然后我尝试这样写音频帧: 问题是我从来不传递这个语句:“if(pkt.stream_index==st->index)”。数据包流索引从来不等于音频流索引。谁能指出我错在哪里? 更新: 顺便说一句,下面的答案没有帮助,因为它假设音频和视频流都来自同一个文件,而在我的情况下,只有音频来自外部源。

  • 在Java中,我使用FFmpeg将WAV文件转换为AAC,函数如下: 当我在Audacity中打开这两个文件时,我可以清楚地看到AAC文件的长度增加了0.05秒,开头增加了0.05秒的沉默。 这是一个问题,当我试图将这个AAC文件与视频文件多路复用时,音频无法同步。 是否有某种参数来防止这种行为或另一种方法来解决这个问题? 编辑-运行函数时的控制台输出:

  • 我想从视频中提取对齐的音频流。目标是获得与视频精确对齐的音频序列。 问题:视频和音频序列不对齐。输出音频持续时间比视频输入短。 要复制的脚本: 我的尝试(没有成功): 按照此答案中的建议添加 添加,同时导出视频(链接) 在Audacity中打开。那里的持续时间是 在VLC中打开。持续时间: 显式设置帧率 其他视频文件 如果能给我一些建议,我将不胜感激。非常感谢。

  • 我正在尝试将Gradle(1.4)添加到一个现有的项目中,该项目有多个测试套件。位于中的标准单元测试成功运行,但我在设置任务以运行位于中的JUnit测试时遇到了麻烦。 当我运行时,对于中的类,我遇到了几个错误。这使我认为依赖项设置不正确。如何设置以便它运行我的JUnit集成测试? Build.Gradle 细节:1.4级 解决方案:我没有为集成测试源集设置编译类路径(参见下面)。在我的I代码中,我

  • 我在尝试连接FFMPEG中的多个文件时遇到了一个问题;我的目标是通过串联不同类型的幻灯片来创建视频演示文稿: (a)图像幻灯片,通过循环帧片刻转换成视频。这些类型的幻灯片没有音频,所以我为它们添加了静音音轨: (b)视频幻灯片,它有一个覆盖的水印,并持续到视频结束。如果文件不包含音频,则添加的方式与前面的情况相同: 因此,一旦我有了所有生成的文件和一个包含所有文件名的。txt文件,我想使用简单的命