ffmpeg:如何自动确定输出扩展名(-c:a copy)

Aze*_*edo 7 ffmpeg

在ffmpeg中,是否可以在从视频中提取(复制)音频流时自动确定音频扩展名?

ffmpeg -i movie.mkv -vn -c:a copy audioOnly.{?}
Run Code Online (Sandbox Code Playgroud)

movie.mkv 中的音频可以是任何格式(mpeg3、aac、flac、wav、vorbis 等)

Gar*_*rey 2

容器和编码之间存在差异。m4v是一个容器,WAV、WMA、WMV、AAC等也是一个容器,它们都支持多种编码。但是,有一些一般模式。ffprobe 可以提供帮助。

这里非常全面地介绍了使用 ffmpeg 从视频文件中提取音频: https: //gist.github.com/protrolium/e0dbd4bb0f1a396fcb55

其中,有一个示例说明在某些情况下如何使用 ffprobe 和 sed 来完成您所寻求的操作:

for file in *mp4 *avi; do ffmpeg -i "$file" -vn -acodec copy "$file".`ffprobe "$file" 2>&1 |sed -rn 's/.Audio: (...), ./\1/p'`; done
Run Code Online (Sandbox Code Playgroud)

在链接页面中,上面的内容似乎已被 html 编码损坏。我已经尝试修复它。对于单个文件来说,它可能会被简化为:

ffmpeg -i "myfile.m4v" -vn -acodec copy "myfile".`ffprobe "myfile.m4v" 2>&1 |sed -rn 's/.Audio: (...), ./\1/p'`
Run Code Online (Sandbox Code Playgroud)

但是,如果您不使用 sed 和 bash shell,那么这将不起作用。(即不适用于 Windows)。如果视频文件中的编码通常不映射到文件扩展名,它也将不起作用。在 Windows 中,您可能会想出一个 powershell 或 vbscript 来完成同样的事情。

  • 不需要 `sed`:`ffprobe -loglevel error -select_streams a:0 -show_entries stream=codec_name -of csv=p=0 input.foo`。但是,正如您所提到的,这是一种脆弱的方法,因为编解码器名称并不总是等于可用的文件扩展名。 (6认同)
  • 终于找到了我一直在寻找的答案。但必须使用这样的代码实在是太疯狂了! (3认同)