FFmpeg支持的所有文件扩展名是什么?

8

如何获取FFmpeg支持的所有文件扩展名列表,以便在JavaFX中的FileChooser中使用ExtensionFilter?

我熟悉FFmpeg的“-codecs”和“-formats”选项,但这些选项列出的是格式和编解码器名称,不一定与它们的文件扩展名相对应。

例如(从“ffmpeg -formats”的部分输出)

  • D aac raw ADTS AAC(高级音频编码)
  • DE ac3 raw AC-3
  • E matroska Matroska

从ffmpeg的输出中解析出aac和ac3可以很好地创建这些类型文件的文件扩展名,但matroska有“.mkv”文件扩展名。

2个回答

11

没有直接可用的列表。 您必须运行

对于输入格式,ffmpeg -demuxers
对于输出格式,ffmpeg -muxers

然后针对每个条目运行

对于输入格式,ffmpeg -h demuxer=entry
对于输出格式,ffmpeg -h muxer=entry

每个格式的读出将显示以下内容,

Muxer matroska [Matroska]:
    Common extensions: mkv.
    Mime type: video/x-matroska.
    Default video codec: h264.
...
或者
Demuxer avi [AVI (Audio Video Interleaved)]:
    Common extensions: avi.
...

然后你可以从“常用扩展名”条目中收集所有扩展名。


感谢您的细心和快速响应。这正是我所需要的。 - zjevander
4
要获得一个好的列表,请运行以下命令:ffmpeg -demuxers -hide_banner | tail -n +5 | cut -d' ' -f4 | xargs -i{} ffmpeg -hide_banner -h demuxer={} | grep 'Common extensions' | cut -d' ' -f7 | tr ',' $'\n' | tr -d '.'如果要获取复用器(muxing)的列表,只需将demux替换为mux即可。 - XMB5

1

根据Gyan的回答,这是我用来获取ffmpeg所有可能扩展名的Python脚本,它可以用于其复用器和解复用器:

import subprocess, re

ffmpeg = 'c:/ffmpeg/bin/ffmpeg.exe'

LINE_PATTERN = r' +\S+ +(\S+)'
EXT_PATTERN = r'Common extensions: (.+)\.'

# Get demuxers
output = subprocess.getoutput([ffmpeg, '-hide_banner', '-demuxers'])
lines = output.split('\n')[4:]

demuxers = {}
for line in lines:
  demuxer = re.findall(LINE_PATTERN, line)[0]
  
  info = subprocess.getoutput([ffmpeg, '-hide_banner', '-h', f'demuxer={demuxer}'])
  exts = re.findall(EXT_PATTERN, info)
  if exts:
    demuxers[demuxer] = exts[0].split(',')


# Get muxers
output = subprocess.getoutput([ffmpeg, '-hide_banner', '-muxers'])
lines = output.split('\n')[4:]

muxers = {}
for line in lines:
  muxer = re.findall(LINE_PATTERN, line)[0]

  info = subprocess.getoutput([ffmpeg, '-hide_banner', '-h', f'muxer={muxer}'])
  exts = re.findall(EXT_PATTERN, info)
  if exts:
    muxers[muxer] = exts[0].split(',')


# Write extensions
file_name = 'ffmpeg_extensions.txt'
f = open(file_name, 'w')

exts = set()
for ext in demuxers.values():
  [exts.add(x.strip()) for x in ext]
for ext in muxers.values():
  [exts.add(x.strip()) for x in ext]
for ext in sorted(exts):
  f.write(ext + '\n')

f.close()

print('Extensions written to file: ' + file_name)

这个脚本对我来说从未停止。 - ClioCJS
对我来说,执行这个操作大约需要1分钟,因为它会为每个复用器和解复用器调用ffmpeg可执行文件。你可以在每个for line的内部插入print(line),以检查进度。我已经在Windows上使用了6.0版本的ffmpeg进行了测试。 - mortalis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接