上下文

上下文

上下文

我有一个包含四个流的文件:1 个视频流,3 个音频流(见下面的证明)。

$ ffprobe -v quiet -of flat -show_entries stream=codec_type,index:stream_tags=title 'my_input_file.mkv'
streams.stream.0.index=0
streams.stream.0.codec_type="video"
streams.stream.1.index=1
streams.stream.1.codec_type="audio"
streams.stream.1.tags.title="English"
streams.stream.2.index=2
streams.stream.2.codec_type="audio"
streams.stream.2.tags.title="Português (BR)"
streams.stream.3.index=3
streams.stream.3.codec_type="audio"
streams.stream.3.tags.title="Português (PT)"

我想从中删除 2 个葡萄牙语音频流,所以我写了以下命令。此命令将输出一个包含视频流和英语音频流的my_input_file.mkv文件(见下面的证明)my_output_file.mkv

$ ffmpeg -v quiet -i 'my_input_file.mkv' -c copy -map 0:v:0 -map 0:a:0 'my_output_file.mkv'
$ ffprobe -v quiet -of flat -show_entries stream=codec_type,index:stream_tags=title 'my_output_file.mkv'
streams.stream.0.index=0
streams.stream.0.codec_type="video"
streams.stream.1.index=1
streams.stream.1.codec_type="audio"
streams.stream.1.tags.title="English"

问题

现在我有两个文件,所以我需要删除另一个。但是,我担心这种解决方法的计算成本:创建源的副本,然后删除源。我认为如果我可以从源中删除特定流而不创建副本,这会更快。

我尝试执行以下命令(参见下面的代码块)。但是,似乎ffmpeg无法就地编辑文件。

$ ffmpeg -v warning -i 'my_input_file.mkv' -c copy -map 0:v:0 -map 0:a:0 'my_input_file.mkv'
File 'my_input_file.mkv' already exists. Overwrite? [y/N] y
Output my_input_file.mkv same as Input #0 - exiting
FFmpeg cannot edit existing files in-place.

问题

是否有任何工具/方法可以使源文件不包含这两个音频流,而无需创建源文件的副本?

我看到有人推荐mkvtoolnix。但是,我从来没有使用过这些命令,所以我想知道这些命令是否可以实现这一点。

答案1

这是不可能的。正如消息所述,您无法就地覆盖现有文件,因此当您想要修改它时,您总是必须先将其复制到其他地方,然后重命名文件。流复制在计算上非常便宜,因此您所需要的只是磁盘空间。

PS:我不知道有哪个程序可以允许在不借助临时文件的情况下进行就地编辑。除非您可以将整个(新)文件加载到内存中并从那里写入。当然,可以非常轻松地使用文本文件进行就地编辑。但是,这样做相当不安全,也不太实用,尤其是对于大型媒体文件。

相关内容