- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试混合几个不同的音频流并试图让它们同时播放而不是一次一个。
下面的代码一次播放一个,我想不出不使用 Java Mixer API 的解决方案。不幸的是,我的声卡不支持使用 Mixer API 进行同步,我不得不想办法通过代码来实现。
请指教。
/////代码如下////
class MixerProgram {
public static AudioFormat monoFormat;
private JFileChooser fileChooser = new JFileChooser();
private static File[] files;
private int trackCount;
private FileInputStream[] fileStreams = new FileInputStream[trackCount];
public static AudioInputStream[] audioInputStream;
private Thread trackThread[] = new Thread[trackCount];
private static DataLine.Info sourceDataLineInfo = null;
private static SourceDataLine[] sourceLine;
public MixerProgram(String[] s)
{
trackCount = s.length;
sourceLine = new SourceDataLine[trackCount];
audioInputStream = new AudioInputStream[trackCount];
files = new File[s.length];
}
public static void getFiles(String[] s)
{
files = new File[s.length];
for(int i=0; i<s.length;i++)
{
File f = new File(s[i]);
if (!f.exists())
System.err.println("Wave file not found: " + filename);
files[i] = f;
}
}
public static void loadAudioFiles(String[] s)
{
AudioInputStream in = null;
audioInputStream = new AudioInputStream[s.length];
sourceLine = new SourceDataLine[s.length];
for(int i=0;i<s.length;i++){
try
{
in = AudioSystem.getAudioInputStream(files[i]);
}
catch(Exception e)
{
System.err.println("Failed to assign audioInputStream");
}
monoFormat = in.getFormat();
AudioFormat decodedFormat = new AudioFormat(
AudioFormat.Encoding.PCM_SIGNED,
monoFormat.getSampleRate(), 16, monoFormat.getChannels(),
monoFormat.getChannels() * 2, monoFormat.getSampleRate(),
false);
monoFormat = decodedFormat; //give back name
audioInputStream[i] = AudioSystem.getAudioInputStream(decodedFormat, in);
sourceDataLineInfo = new DataLine.Info(SourceDataLine.class, monoFormat);
try
{
sourceLine[i] = (SourceDataLine) AudioSystem.getLine(sourceDataLineInfo);
sourceLine[i].open(monoFormat);
}
catch(LineUnavailableException e)
{
System.err.println("Failed to get SourceDataLine" + e);
}
}
}
public static void playAudioMix(String[] s)
{
final int tracks = s.length;
System.out.println(tracks);
Runnable playAudioMixRunner = new Runnable()
{
int bufferSize = (int) monoFormat.getSampleRate() * monoFormat.getFrameSize();
byte[] buffer = new byte[bufferSize];
public void run()
{
if(tracks==0)
return;
for(int i = 0; i < tracks; i++)
{
sourceLine[i].start();
}
int bytesRead = 0;
while(bytesRead != -1)
{
for(int i = 0; i < tracks; i++)
{
try
{
bytesRead = audioInputStream[i].read(buffer, 0, buffer.length);
}
catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(bytesRead >= 0)
{
int bytesWritten = sourceLine[i].write(buffer, 0, bytesRead);
System.out.println(bytesWritten);
}
}
}
}
};
Thread playThread = new Thread(playAudioMixRunner);
playThread.start();
}
}
最佳答案
问题是您没有将样本加在一起。如果我们正在查看 4 个音轨、16 位 PCM 数据,您需要将所有不同的值加在一起以将它们“混合”成一个最终输出。因此,从纯数字的角度来看,它看起来像这样:
[Track1] 320 -16 2000 200 400
[Track2] 16 8 123 -87 91
[Track3] -16 -34 -356 1200 805
[Track4] 1011 1230 -1230 -100 19
[Final!] 1331 1188 537 1213 1315
在你上面的代码中,你应该只写一个字节数组。该字节数组是所有音轨加在一起的最终混合。问题是您正在为每个不同的轨道编写一个字节数组(因此没有发生混音,正如您观察到的那样)。
如果你想保证你没有任何“剪辑”,你应该取所有轨道的平均值(因此将上面的所有四个轨道相加并除以 4)。然而,选择这种方法会产生一些瑕疵(比如如果你在三个音轨和一个响亮的音轨上静音,最终输出将比一个非静音音轨的音量安静得多)。您可以使用更复杂的算法来进行混合,但到那时您正在编写自己的混合器:P。
关于java - 使用 Java 进行音频混合(没有 Mixer API),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5922135/
pygame.mixer init 和 pygame.mixer pre init 有什么区别?我看了一个教程,他用的是pre-init,但是解释的不是很清楚。我应该只使用 mixer init,还是
即使在空白程序中,如果我键入代码行, pygame.mixer.init() PyCharm 抛出错误, NotImplementedError: mixer module not availab
我正在尝试使用Python制作自己的音乐播放器,并且在研究了其他选择之后,我决定使用pygame的mixer.music实际播放音频。 (我以前使用过pygame,通常是在实际游戏中使用),而我一直在
我正在尝试使用“cabal install sdl-mixer”来安装 SDL-mixer haskell 软件包。当我这样做时,它给出了错误 Resolving dependencies... [1
我有一个支持 Istio 的 EKS 集群,但我的节点经常出现磁盘空间不足的情况。 计算总体磁盘使用情况后,我找到了 istio-mixer 容器,该容器的日志文件仅在 12 天内就使用了超过 50G
我正在尝试为 friend 制作一个小程序,它需要运行一个 .wav 文件当我在 python 中运行它时它工作正常但是当我在 py2exe 中编译它时它给了我这个 --> phone.exe:23:
使用 pygame 混音器,我打开一个音频文件并对其进行操作。我找不到将“声音对象”保存到磁盘上的本地文件的方法。 sound_file = "output.mp3" sound = pygame
当我尝试运行以下代码时,我没有收到任何错误或声音。声音文件没有损坏,我也尝试了许多其他声音文件。 import pygame pygame.mixer.init(44100, -16, 2, 2048
我使用了以前的堆栈溢出帖子来帮助我开发以下代码: import os import pygame from pygame import * import sys GAME_FOLDER = os.pa
我想为我的神经科学研究生成一系列特定频率和持续时间的音频提示。经过一番谷歌搜索,我发现一个名为 Pygame 的 Python 模块似乎能够完成这项工作。 sound = pygame.sndarra
我几乎已经完成了我的示例游戏,这是我的回避游戏,设置完毕,无论有没有背景音乐,游戏都运行得很好,但是,当我尝试添加游戏结束声音时,python 提示以下错误 Traceback (most recen
我一直在使用 pygame.mixer 开发一个与声音相关的 Pygame 项目,但我遇到了一个似乎无法解决的问题。我无法打开我尝试过的任何声音文件(.mp3 和 .midi)。 我在 PyCharm
我有俄语 Windows 7,其中一些设备以俄语命名。如果我通过 AudioSystem.getMixerInfo() 获得诸如混音器之类的设备,我会将 Mixer.Info.getName() 错误
我创建了以下使用 pygame.mixer 播放 mp3 音乐的代码。但是,音乐不会重复。关于如何使音乐重复播放的任何想法?这是代码: playlist = list() playlist.appen
我试图让 Java 在两个输出(正面和背面音频插孔)中播放不同的立体声音频。 我的声卡配置为独立处理两个输出,在 Windows 混音器中我可以让它们分别发出测试声音,所以这不是卡问题。 我在 Cha
所以我有一个将我的 .wav 文件加载到内存中的存档,我正在尝试从 void* 或内存中的句柄播放 .WAV。 II 不能在目录中包含所有 .wav 文件,我有一个将它们加载到内存中的函数。 这是我正
我正在尝试寻找支持麦克风耳机插孔的特定混音器。请让我知道我的代码中做错了什么。我不完全明白我需要做什么。 Mixer.Info[] mixerInfo = AudioSystem.getMix
我正在用 pygame 制作贪吃蛇游戏,我想了解一些关于 pygame.mixer.music() 的知识。 代码: snakebodypos.insert(0, list(snakepos)) if
如何使用pygame选择某首歌曲进行播放?我将它们放入列表中,但以下代码不起作用。当我运行该应用程序时,它打印“无”,当我取消对 pygame.mixer.music.play 的注释时,该应用程序给
这个问题已经有答案了: How do I schedule an audio file to play automatically in pygame after the first song end
我是一名优秀的程序员,十分优秀!