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

iezvtpos  于 2022-12-28  发布在  Java
关注(0)|答案(2)|浏览(155)

我如何才能获得FFmpeg支持的所有文件扩展名的列表,以便在JavaFX中的FileChooser使用的ExtensionFilter中使用?
我熟悉FFmpeg中的“-codecs”和“-formats”选项,但这些选项列出的格式和编解码器名称不一定与它们的文件扩展名一致。
例如(“ffmpeg格式”的部分输出)

  • 高级音频编码(AAC)
  • DE ac 3未加工AC-3
  • 马特罗斯卡

从FFMPEG的输出中解析AAC和AC 3,可以很好地为这些类型的文件创建文件扩展名,但是Matroska具有“.mkv”文件扩展名。

gc0ot86w

gc0ot86w1#

没有直接可用的列表。您必须运行
对于输入格式,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.
...

然后您可以从Common extensions条目中收集所有扩展名。

j0pj023g

j0pj023g2#

根据Gyan的答案,我使用了一个python脚本来获取ffmpeg的所有可能扩展,用于其复用器和解复用器:

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
f = open('ffmpeg_extensions.txt', '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()

相关问题