之前,我问过使用FFT和Complex类获取频率wav音频的问题,
在那里,我需要从AudioRecord输入计算FFT值 - >从麦克风,我以某种方式设法获得FFT值...
现在我需要从之前保存的*.wav音频文件中计算FFT值,我将音频保存在我项目'res'文件夹内'raw'文件夹中
我仍然使用相同的FFT类:http://www.cs.princeton.edu/introcs/97data/FFT.java
与它一起使用的复杂类:http://introcs.cs.princeton.edu/java/97data/Complex.java.html
我使用这种方法从我的原始文件中读取音频文件,然后我调用方法calculateFFT来使用它
private static final int RECORDER_BPP = 16;
private static final int RECORDER_SAMPLERATE = 44100;
private static final int RECORDER_CHANNELS = AudioFormat.CHANNEL_IN_STEREO;
private static final int RECORDER_AUDIO_ENCODING = AudioFormat.ENCODING_PCM_16BIT;
private void asli(){
int counter = 0;
int data;
InputStream inputStream = getResources().openRawResource(R.raw.b1);
DataInputStream dataInputStream = new DataInputStream(inputStream);
List<Integer> content = new ArrayList<Integer>();
try {
while ((data = dataInputStream.read()) != -1) {
content.add(data);
counter++; }
} …Run Code Online (Sandbox Code Playgroud) 是否可以AudioTrack从资源文件夹raw 播放wav文件?它尝试了很多方法来引用我的Android项目中的原始文件,但是我有很多例外.
这就是我现在所拥有的,但是当我按下按钮时,没有声音播放.
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Button buttonPlayAudioTrack = (Button) findViewById(R.id.buttonPlayAudioTrack);
buttonPlayAudioTrack.setOnClickListener(this);
int minBufferSize = AudioTrack.getMinBufferSize(44100, AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_16BIT);
audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, 44100, AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_16BIT, minBufferSize, AudioTrack.MODE_STREAM);
}
public void onClick(View v) {
// TODO Auto-generated method stub
if(v.getId() == R.id.buttonPlayAudioTrack)
playSound();
}
private void playSound() {
audioTrack.play();
int i = 0;
int bufferSize = 512;
byte [] buffer = new byte[bufferSize];
InputStream inputStream = getResources().openRawResource(R.raw.piano12);
try {
while((i = inputStream.read()) != -1)
audioTrack.write(buffer, 0, …Run Code Online (Sandbox Code Playgroud) 我需要获取当前的Active音频会话ID以附加一些音频效果.此会话不一定由我的进程创建.
是否有audioTrack提供的接口或其他东西来实现此功能?
我正在使用AudioTrack实例播放音乐.当用户在歌曲中改变歌曲或寻找时我想在播放新数据之前刷新缓冲区.stop()的文档似乎指导我做类似的事情:
audioTrack.pause();
audioTrack.flush();
audioTrack.play();
audioTrack.write(newData, ...);
Run Code Online (Sandbox Code Playgroud)
但是,这通常会产生轻微的静电.我尝试了一些解决方法.在我的测试设备上工作的一个(如摆脱静态)是flush()之后的Thread.sleep(10,0).但它感觉非常hackish和任意,如果它不能在其他设备上工作怎么办?此外,我不想阻止纳米片超过必要的时间.
解决这个问题的正确方法是什么?
我正在测试一个 Android 应用程序的概念,该应用程序允许您通过 RFCOMM(从 PC 到手机)流式传输蓝牙。我可以毫无问题地将音频从我的计算机传输到手机并开始流式传输音频。
问题是音频开始断断续续,我从AudioTrack. 从套接字读取是最耗时的。当我对它计时,当>= 1000读取返回需要几毫秒时就会发生欠载,而平均需要几百次才能返回。这是我的代码如下:
public ConnectedThread(BluetoothSocket socket) {
this.setPriority(MAX_PRIORITY);
mmSocket = socket;
InputStream tmpIn = null;
OutputStream tmpOut = null;
// Get the input and output streams; using temp objects because
// member streams are final.
try {
tmpIn = socket.getInputStream();
} catch (IOException e) {
Log.e(TAG, "Error occurred when creating input stream", e);
}
try {
tmpOut = socket.getOutputStream();
} catch (IOException e) {
Log.e(TAG, "Error occurred when creating output …Run Code Online (Sandbox Code Playgroud) 我在将两个音轨合并为一个时遇到问题,以便将整个合并的音频添加到视频轨道中。
this.promises = [navigator.mediaDevices.getUserMedia({ audio: true, video: true })];
if (navigator['getDisplayMedia']) {
this.promises.push(navigator['getDisplayMedia'](this.streamConstraints));
}
else if (navigator.mediaDevices['getDisplayMedia']) {
this.promises.push(navigator.mediaDevices['getDisplayMedia'](this.streamConstraints));
}
else {
this.promises.push(navigator.mediaDevices.getUserMedia({ video: { mediaSource: 'screen' } as any }));
}
Promise.all(this.promises)
.then((streams) => {
// so here is the microphone audio and webcam video
const avTracks = streams[0].getTracks();
// here is the screen video and audio
const screenRecordTracks = streams[1].getTracks();
const firstAudioTrack = new MediaStream(avTracks).getAudioTracks();
const secondAudioTrack= new MediaStream(screenRecordTracks ).getAudioTracks();
// so here I want to merge these …Run Code Online (Sandbox Code Playgroud) 我正在制作一个带有一系列频率值(即440Hz,880Hz,1760Hz)的类,并播放它们组合成单个AudioTrack的声音.我不是一个合理的程序员,所以我自己写这篇文章很困难,我认为对于经验丰富的声音程序员来说这是一个相对容易的问题.以下是play方法中的一些代码:
public void play() {
// Get array of frequencies with their relative strengths
double[][] soundData = getData();
// TODO
// Perform a calculation to fill an array with the mixed sound - then play it in an infinite loop
// Need an AudioTrack that will play calculated loop
// Track sample info
int numOfSamples = DURATION * SAMPLE_RATE;
double sample[] = new double[numOfSamples];
byte sound[] = new byte[2 * numOfSamples];
// fill out the array
for (int i = …Run Code Online (Sandbox Code Playgroud) 我使用的解码音频MediaExtractor,MediaCodec和AudioTrack。我配置AudioTrack使用MediaFormat由归国MediaCodec.getOutputFormat()接收后MediaCodec.INFO_OUTPUT_FORMAT_CHANGED从MediaCodec。在某些设备上,这会导致音频加速,而MediaFormat返回的则MediaExtractor正常工作。(在其他设备上,情况正好相反。)
以下是一些细节:
MediaFormat,因为我无法访问这些设备,但我假设它返回单声道的立体声,或 22050 Hz 的 44100 Hz,而不实际重新采样文件。任何帮助,将不胜感激。谢谢!
如果用户按下开始按钮,我有一个短代码可以将录制的音频实时传输到扬声器。在他按下停止按钮后,缓冲的音频应该保存在一个 mp3 文件中。该文件已创建,但它是空的。如果我尝试播放文件,我听不到任何声音。
public class MainActivity extends Activity {
boolean m_stop = true;
AudioTrack m_audioTrack;
Thread m_noiseThread;
static final int bufferSize = 200000;
AudioRecord arec;
FileOutputStream os = null;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void onStartStopClicked(View v)
{
Button StartButton = (Button)findViewById(R.id.StartStop);
if(m_stop) {
start();
} else {
stop();
}
}
Runnable m_noiseGenerator = new Runnable()
{
public void run()
{
String filepath = Environment.getExternalStorageDirectory().toString();
os = new FileOutputStream(filepath + "/test.mp3");
int buffersize1 = AudioRecord.getMinBufferSize(11025, …Run Code Online (Sandbox Code Playgroud) 我有一个使用 ExoPlayer 流式传输视频的 android 应用程序。我想为流添加语言支持。流将使用什么语言,必须从流的元数据中获取。
在 ExoPlayer 库中,我找到了通过以下方式从流中获取曲目列表的方法:
player.getCurrentTrackGroups().get(i).getFormat(i) //player is SimpleExoPlayer class
Run Code Online (Sandbox Code Playgroud)
但这给了我一些原始信息,这是需要标记的视频、音频和其他曲目。打印格式如下所示:
格式(1/100, null, video/avc, -1, null, [1920, 1080, -1.0], [-1, -1])
格式(1/8292, null, application/cea-608, -1 , null, [-1, -1, -1.0], [-1, -1])
格式(1/200, null, audio/mpeg-L2, -1, , [-1, -1, -1.0] , [2, 48000])
格式(1/201, null, audio/mpeg-L2, -1, , [-1, -1, -1.0], [2, 48000])
我想知道是否有一种更简单的方法可以只获取音轨及其所需的信息,以便以后在它们之间切换。
我的下一个问题是我不知道如何在音轨之间切换。我搜索并接受了一个答案,这是通过以下代码完成的:
player.selectTrack(FullPlayer.TYPE_AUDIO, ExoPlayer.TRACK_DEFAULT);
Run Code Online (Sandbox Code Playgroud)
此代码取自此答案。问题是,我的SimpleExoPlayer类没有这个功能。我有 exoplayer 2.8.2 并且SimpleExoPlayer和ExoPlayer类都没有这个功能。所以我被困在那里。
另一个找到的答案来自 DefaultTrackSelector 类,它具有以下内容:
trackSelector.setParameters( trackSelector.getParameters().buildUpon().setPreferredAudioLanguage("eng"));
Run Code Online (Sandbox Code Playgroud)
这看起来简单而好方法,但并非所有流都被标记为这样。许多曲目没有语言名称字符串。他们唯一不同的是ID字符串。并且传递 id 字符串不起作用。
audiotrack ×10
android ×8
audio ×3
java ×2
angular ×1
audiorecord ×1
bluetooth ×1
exoplayer ×1
fft ×1
inputstream ×1
javascript ×1
mediastream ×1
mp3 ×1
outputstream ×1
sockets ×1