从 AudioSystem 获取支持的 AudioFormat 列表
Getting supported AudioFormat list from AudioSystem
我希望能够调查系统支持的可用 AudioFormat
类型,以便从一系列选项中选择合适的类型,使用帧速率的首选值和回退值以及频道。
AudioSystem
不支持直接查询支持的音频格式,但我可以从 Mixer
中获取可用 SourceDataLine
的列表。而SourceDataLine
继承了一个DataLine.Info
内部调用,其中有一个方法return可用的格式:getFormats ()
.
所以我的主要问题是:有没有办法从 Java 音频系统中获取一组支持的 AudioFormat
对象?
失败:是否有办法从 Mixer
中获取支持的 AudioFormat
对象数组?
如果失败:是否有可能从 SourceDataLine
中获取 DataLine.Info
对象?
理想情况下,我想做一些像以下的事情:
public void exec () {
Mixer.Info [] mixerInfoList = AudioSystem.getMixerInfo ();
for (Mixer.Info mixerInfo : mixerInfoList) {
System.out.println (mixerInfo.getDescription ());
Mixer mixer = AudioSystem.getMixer (mixerInfo);
Line.Info [] lineInfoList = mixer.getSourceLineInfo ();
for (Line.Info rawLineInfo : lineInfoList) {
System.out.println (" " + rawLineInfo.toString ());
DataLine.Info lineInfo = (DataLine.Info) rawLineInfo;
AudioFormat [] formats = lineInfo.getFormats ();
for (AudioFormat fmt : formats) {
System.out.println (" " + fmt.toString ());
}
}
}
}
但这在行 DataLine.Info lineInfo = (DataLine.Info) rawLineInfo;
上失败了,因为 rawLineInfo
显然是一个依赖于实现的对象,而不是 DataLineInfo
.
的实例
mixer.getSourceLineInfo ()
不是 return DataLine.Info
的数组,这真是令人非常失望。没有理由不这样做,因为相关行肯定是 SourceDataLine
的实现,因此必须支持 AudioFormat
.
使用@gpasch(感谢堆友)在接受的答案中提供的信息,这是我的最终解决方案。函数 isDesirable
仅标识我感兴趣的音频格式。Class AudioFormatKey
是一个包装器,它为 distinct()
转换提供 equals()
的实现,并且 compareTo()
用于 sorted()
变换。
public void exec () {
System.out.println ("Available formats (stream):");
Arrays.stream (AudioSystem.getSourceLineInfo (new Line.Info (SourceDataLine.class)))
.filter (info -> info instanceof DataLine.Info)
.map (info -> (DataLine.Info) info)
.flatMap (dlinfo -> Arrays.stream (dlinfo.getFormats ()))
.filter (this::isDesirable)
.map (AudioFormatKey::new)
.distinct ()
.sorted ()
.map (AudioFormatKey::getFormat)
.forEach (format -> System.out.println (" " + format));
}
我有这个东西 - 它在 Windows 中获取格式列表。我不知道是否所有这些都受支持或它们有效,但它给出了一个列表。
public void getFormats() {
Line.Info desired = new Line.Info( SourceDataLine.class );
Line.Info[] info = AudioSystem.getSourceLineInfo( desired );
for ( int i = 0; i < info.length; ++i ) {
System.out.println(i+" "+info[i].toString());
if ( info[ i ] instanceof DataLine.Info ) {
AudioFormat[] forms = ((DataLine.Info) info[i]).getFormats();
for ( int n = 0; n < forms.length; ++n ) System.out.println( forms[ n ].toString() );
}
}
desired = new Line.Info( TargetDataLine.class );
info = AudioSystem.getTargetLineInfo( desired );
for ( int i = 0; i < info.length; ++i ) {
System.out.println(i+" "+info[i].toString());
if ( info[ i ] instanceof DataLine.Info ) {
AudioFormat[] forms = ((DataLine.Info) info[i]).getFormats();
for ( int n = 0; n < forms.length; ++n ) System.out.println( forms[ n ].toString() );
}
}
}
我希望能够调查系统支持的可用 AudioFormat
类型,以便从一系列选项中选择合适的类型,使用帧速率的首选值和回退值以及频道。
AudioSystem
不支持直接查询支持的音频格式,但我可以从 Mixer
中获取可用 SourceDataLine
的列表。而SourceDataLine
继承了一个DataLine.Info
内部调用,其中有一个方法return可用的格式:getFormats ()
.
所以我的主要问题是:有没有办法从 Java 音频系统中获取一组支持的 AudioFormat
对象?
失败:是否有办法从 Mixer
中获取支持的 AudioFormat
对象数组?
如果失败:是否有可能从 SourceDataLine
中获取 DataLine.Info
对象?
理想情况下,我想做一些像以下的事情:
public void exec () {
Mixer.Info [] mixerInfoList = AudioSystem.getMixerInfo ();
for (Mixer.Info mixerInfo : mixerInfoList) {
System.out.println (mixerInfo.getDescription ());
Mixer mixer = AudioSystem.getMixer (mixerInfo);
Line.Info [] lineInfoList = mixer.getSourceLineInfo ();
for (Line.Info rawLineInfo : lineInfoList) {
System.out.println (" " + rawLineInfo.toString ());
DataLine.Info lineInfo = (DataLine.Info) rawLineInfo;
AudioFormat [] formats = lineInfo.getFormats ();
for (AudioFormat fmt : formats) {
System.out.println (" " + fmt.toString ());
}
}
}
}
但这在行 DataLine.Info lineInfo = (DataLine.Info) rawLineInfo;
上失败了,因为 rawLineInfo
显然是一个依赖于实现的对象,而不是 DataLineInfo
.
mixer.getSourceLineInfo ()
不是 return DataLine.Info
的数组,这真是令人非常失望。没有理由不这样做,因为相关行肯定是 SourceDataLine
的实现,因此必须支持 AudioFormat
.
使用@gpasch(感谢堆友)在接受的答案中提供的信息,这是我的最终解决方案。函数 isDesirable
仅标识我感兴趣的音频格式。Class AudioFormatKey
是一个包装器,它为 distinct()
转换提供 equals()
的实现,并且 compareTo()
用于 sorted()
变换。
public void exec () {
System.out.println ("Available formats (stream):");
Arrays.stream (AudioSystem.getSourceLineInfo (new Line.Info (SourceDataLine.class)))
.filter (info -> info instanceof DataLine.Info)
.map (info -> (DataLine.Info) info)
.flatMap (dlinfo -> Arrays.stream (dlinfo.getFormats ()))
.filter (this::isDesirable)
.map (AudioFormatKey::new)
.distinct ()
.sorted ()
.map (AudioFormatKey::getFormat)
.forEach (format -> System.out.println (" " + format));
}
我有这个东西 - 它在 Windows 中获取格式列表。我不知道是否所有这些都受支持或它们有效,但它给出了一个列表。
public void getFormats() {
Line.Info desired = new Line.Info( SourceDataLine.class );
Line.Info[] info = AudioSystem.getSourceLineInfo( desired );
for ( int i = 0; i < info.length; ++i ) {
System.out.println(i+" "+info[i].toString());
if ( info[ i ] instanceof DataLine.Info ) {
AudioFormat[] forms = ((DataLine.Info) info[i]).getFormats();
for ( int n = 0; n < forms.length; ++n ) System.out.println( forms[ n ].toString() );
}
}
desired = new Line.Info( TargetDataLine.class );
info = AudioSystem.getTargetLineInfo( desired );
for ( int i = 0; i < info.length; ++i ) {
System.out.println(i+" "+info[i].toString());
if ( info[ i ] instanceof DataLine.Info ) {
AudioFormat[] forms = ((DataLine.Info) info[i]).getFormats();
for ( int n = 0; n < forms.length; ++n ) System.out.println( forms[ n ].toString() );
}
}
}