如何从mp4视频文件中删除音轨?


Answers:


110

首先运行ffmpeg -i file.mp4以查看文件中存在哪些流。您应该会看到以下内容:

Stream #0.0: Video: mpeg4, yuv420p, 720x304 [PAR 1:1 DAR 45:19], 23.98 tbr, 23.98 tbn, 23.98 tbc
Stream #0.1: Audio: ac3, 48000 Hz, 5.1, s16, 384 kb/s
Stream #0.2: Audio: ac3, 48000 Hz, 5.1, s16, 384 kb/s

然后运行ffmpeg -i file.mp4 -map 0:0 -map 0:2 -acodec copy -vcodec copy new_file.mp4以将视频流和第二音频流复制到new_file.mp4


3
在Windows上,此命令给出了错误Option map (set input stream mapping) cannot be applied to input file file.mp4 new_file.mp4 -- you are trying to apply an input option to an output file or vice versa. Move this option before the file it belongs to.:修复该错误只需更改参数的顺序即可:ffmpeg -i file.mp4 -map 0:0 -map 0:2 -acodec copy -vcodec copy new_file.mp4
MrLore 2013年

同样的错误@MrLore在OS X
奥斯卡·佩尔松

1
在Ubuntu上也一样!
Tommaso 2014年

也适用于MKV格式
user3405291'1

1
您可以使用更通用的选项-c copy,使音频,视频和字幕具有相同的流:ffmpeg -i input.mp4 -map 0:0 -map 0:2 -c copy output.mp4
致命的

96

相关问题- 因此,可以从mp4文件中删除所有音频轨道:

ffmpeg -i input_file.mp4 -vcodec copy -an output_file.mp4

1
这给了我错误,The encoder 'aac' is experimental but experimental codecs are not enabled, add '-strict -2' if you want to use it.但是我添加了这些标志,并且仍然相同...?
poshaughnessy


关于poshaughnessy的评论:这里似乎有一些信息:stackoverflow.com/questions/32931685/… 讨论表明ffmpeg的最新版本没有遇到“ aac实验”问题。作为一般规则,如果您声明所使用软件的版本以及给出错误的命令的确切语法(在添加标志之后),这将有助于诊断问题(请参见freeseek的答案所在)。 )。在这种特定情况下,来自输入文件的视频信息也可能会有所帮助。
格雷格·马克

8

识别流号:

$ ffmpeg -i in.mp4
   ...
   Stream #0:0: Video: ...
   Stream #0:1: Audio: ...
   Stream #0:2: Audio: ...

使用-map _file_:_stream_选择哪个流处理和输出

$ ffmpeg -i in.mp4 -map 0:0 -map 0:2 -vcodec copy -acodec copy out.mp4

请参阅:https//ffmpeg.org/ffmpeg.html#Advanced-options


4

您可以尝试avidemux在内部仅处理一个音频文件(因此迫使您选择一个特定的轨道)。我从来没有尝试过使用.mp4,但是它可以与其他格式一起使用。


不太好用。也许这是一个错误,但是尽管它确实可以完成工作(删除其余的音轨),但是音频却重新受到了干扰。
tshepang 2011年

3

我多次使用Avidemux(GUI)和ffmpeg(控制台)。

在Avidemux中,在主菜单中选择“音频”->“选择曲目”;然后将您的视频另存为新文件。

有趣的是,在某些情况下,Avidemux的输出要比ffmpeg的“更好”。

以防万一,Avidemux和ffmpeg在标准的Fedora Linux存储库中。(我确定它们在其他Linux版本中也是标准的。)


1

-vn-an将删除所有视频或音频轨道。提供-vn -acodec copy将删除视频;-an -vcodec copy将删除所有音频。

-vcodec copy指定ffmpeg应该直接复制现有的视频轨道(而不对其进行任何处理/编码)。如果未指定,它仍然可以工作,但是ffmpeg可能会重新编码现有的视频轨道,并且该操作将使用更多的CPU,并且可能需要更长的时间。


0

在命令行中使用avidemux。

(在Avidemux GUI中,如上面https://unix.stackexchange.com/a/85834/4319中所述,您只需选择/取消选择音轨,然后保存文件。(所有内容都会复制到新的AVI。)

我查看了为我的动作将哪些项目另存为SpiderMonkey或TinyPy项目,结果发现SpiderMonkey(JavaScript)项目缺少我需要的音轨选择操作,但TinyPy(Python)项目确实有他们。

我删除了所有不相关的内容(许多不需要的行),这就是我的想法some_series.py

#PY  <- Needed to identify #
#--automatically built--

adm = Avidemux()

adm.audioClearTracks()
adm.audioAddTrack(1)

它离开轨道1,但掉落轨道0。

然后,我使用如下命令对许多文件进行了批量转换:

for f in *.avi; do avidemux3_cli --nogui --load "$f" --run ../some_series.py --save ../some_series/"${f%%.rus.eng.avi}".eng.avi --quit; done

它会复制所有内容,但会删除所有需要的音轨。

我从https://www.avidemux.org/admWiki/doku.php?id=tutorial:batch_processing中学到了从命令行运行avidemux的方法,尽管它们没有提到Python脚本,只有JS脚本(这对我不起作用)。


-1

如果您不介意该程序为GUI,则可以使用Blender的视频编辑器执行此操作,甚至更多。


-2

ffmpeg程序已被替换avconvavconv与的用法非常相似ffmpeg,因此本文中的所有命令都可以类似于:

avconv <old ffpmeg command line options>

按照此链接来安装avconv,如果你在Ubuntu。


-3

FFMPEG对您可能是一个有用的解决方案。

$ man ffmpeg

我看了一下,而且很密集。我搜索了“音频”和“音轨”,但似乎没有发现。
tshepang 2011年

@Tshepang,“轨迹”是模棱两可的,这可能就是为什么FFmpeg喜欢更精确的术语的原因。FFmpeg认为音频进入“流”,每个流包含一个或多个“通道”。AFAICT,每个通道都是单声道,其流描述了默认情况下应将其发送(平移)到哪个输出。例如,立体声流包含两个通道,默认情况下一个发送到声卡的左输出,另一个默认发送到声卡的右输出。
sampablokuper
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.