我的动机是使用 NAudio 录制音频,保存为 wav 文件,然后混合多个音频并播放。为此我尝试过
private void buttonRecord_Click(object sender, EventArgs e)
{
//if (sourceList.SelectedItems.Count == 0) return;
//int deviceNumber = sourceList.SelectedItems[0].Index;
sourceStream = new NAudio.Wave.WaveIn();
sourceStream.DeviceNumber = 0;
sourceStream.WaveFormat = new NAudio.Wave.WaveFormat(44100, NAudio.Wave.WaveIn.GetCapabilities(0).Channels);
sourceStream1 = new NAudio.Wave.WaveIn();
sourceStream1.DeviceNumber = 1;
sourceStream1.WaveFormat = new NAudio.Wave.WaveFormat(44100, NAudio.Wave.WaveIn.GetCapabilities(1).Channels);
//NAudio.Wave.WaveInProvider waveIn = new NAudio.Wave.WaveInProvider(sourceStream);
//sourceStream.StartRecording();
//waveOut.Play();
sourceStream1.DataAvailable += new EventHandler<NAudio.Wave.WaveInEventArgs>(waveIn_DataAvailable1);
writer1 = new NAudio.Wave.WaveFileWriter("D:\test.wav", sourceStream1.WaveFormat);
sourceStream1.StartRecording();
sourceStream.DataAvailable += new EventHandler<NAudio.Wave.WaveInEventArgs>( waveIn_DataAvailable);
writer = new NAudio.Wave.WaveFileWriter("D:\test1.wav", sourceStream.WaveFormat);
sourceStream.StartRecording();
}
void waveIn_DataAvailable(object sender, NAudio.Wave.WaveInEventArgs e)
{ …Run Code Online (Sandbox Code Playgroud) 我正在从事录音工作。当应用程序在前台运行时,我必须开始录音并转到后台,当时录音工作正常。
但我的问题是,当我已经在后台时如何开始录音,我的录音功能是这样触发的:
我有一个带有按钮和 iOS 应用程序的蓝牙 LE 设备。这两个设备已配对(蓝牙 LE 设备和运行 iOS 应用程序的 iPhone),iOS 应用程序正在侦听蓝牙 LE 设备上的事件,例如按下按钮等事件。
现在,当用户按下蓝牙 LE 设备上的按钮时,iOS 应用程序会捕获该事件,即使该应用程序位于后台,我也可以运行代码,但无法开始录音。
我已经启用Background Modes:
这是我的录音代码:
func startRecording() {
DispatchQueue.global(qos: .background).asyncAfter(deadline: DispatchTime.now(), qos: .background) {
let audioFilename = self.getDocumentsDirectory().appendingPathComponent("recording.m4a")
print("record Audio \(audioFilename)")
let settings = [
AVFormatIDKey: Int(kAudioFormatMPEG4AAC),
AVSampleRateKey: 12000,
AVNumberOfChannelsKey: 1,
AVEncoderAudioQualityKey: AVAudioQuality.high.rawValue
]
do {
self.audioRecorder = try AVAudioRecorder(url: audioFilename, settings: settings)
self.audioRecorder.delegate = self
self.audioRecorder.record()
} catch {
self.finishRecording(success: false)
}
}
}
Run Code Online (Sandbox Code Playgroud)
我找不到正确的解决方案来做到这一点,请建议我正确的方法来做到这一点,提前致谢。
我在设备上录制声音时遇到了一些问题.我从android开发站点(站点链接)使用的代码如下:
public void onClickStart(View v) throws IllegalStateException, IOException{
startRecord();
}
public void onClickStop(View v) throws IllegalStateException, IOException{
stopRecord();
}
private void startRecord() throws IllegalStateException, IOException{
recorder = new MediaRecorder();
recorder.setAudioSource(MediaRecorder.AudioSource.MIC); //ok so I say audio source is the microphone, is it windows/linux microphone on the emulator?
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
recorder.setOutputFile("/sdcard/test.3gpp");
recorder.prepare();
recorder.start();
}
private void stopRecord(){
recorder.stop();
// recorder.release();
}
Run Code Online (Sandbox Code Playgroud)
在主布局中有2个按钮,它们都会停止并开始录制(理论上是这样).
但是当我在我的设备上尝试这个时,从LogCat(真的不能在模拟器上尝试),我得到以下错误:
Error 1:
ERROR/MediaRecorder(14541): start called in an invalid state: 4
java.lang.IllegalStateException: Could not execute method of the …Run Code Online (Sandbox Code Playgroud) 如果正在播放,录制,我们如何检查MIC是否可用(空闲)进行录制?目前使用
AVCaptureDevice *audioCaptureDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio];
AVCaptureSession *captureSession = [[AVCaptureSession alloc] init];
VCaptureDeviceInput *audioInput = [AVCaptureDeviceInput deviceInputWithDevice : audioCaptureDevice error:&error];
AVCaptureAudioDataOutput *audioOutput = [[AVCaptureAudioDataOutput alloc] init];
[captureSession addInput : audioInput];
[captureSession addOutput : audioOutput];
[captureSession startRunning];
Run Code Online (Sandbox Code Playgroud)
需要先检查从已有的MIC/Playback中获取MIC/Playback.
给定一个字节组和一个新的字节组,其中我需要覆盖其上的原始内容bytearray,但开始从特定位置/偏移(A)如下面的图像中(我们可以说B是长度新数组).如果覆盖超过原始数组的实际长度,也处理新长度.
(这是.WAV文件覆盖在不同位置所需的).

这是我到目前为止尝试但没有运气.
public byte[] ByteArrayAppender(byte[] firstData, byte[] newData, byte[] remainData, int Position) {
byte[] editedByteArray = new byte[firstData.length + newData.length + remainData.length];
System.arraycopy(firstData, 0, editedByteArray, 0, Position);
System.arraycopy(newData, 0, editedByteArray, firstData.length, newData.length);
System.arraycopy(remainData, 0, editedByteArray, newData.length, remainData.length);
return editedByteArray;
}
Run Code Online (Sandbox Code Playgroud) 我需要使用QT(从Windows上的qt 5.7)将从麦克风录制的音频直接回送至扬声器(假设在Windows上为qt 5.7)-假设我无法使用窗口的内部mic->扬声器回送(在麦克风面板上启用“收听此设备” )。
任何方向该怎么做?
从 iOS 12 开始,MediaRecorder尚未实现。然而,MediaDevices 可以工作,允许请求访问用户的麦克风。
我想弄清楚是否至少有一种方法可以直接从浏览器录制音频。我想必须至少有一个,否则授予对麦克风的访问权限有什么意义?
但是我似乎找不到单一的工作解决方案。我错过了什么吗?
我正在构建的应用程序的一部分涉及录音。这是相关代码:
let settings = [
AVFormatIDKey: Int(kAudioFormatMPEG4AAC),
AVSampleRateKey: 12000,
AVNumberOfChannelsKey: 1,
AVEncoderAudioQualityKey: AVAudioQuality.high.rawValue]
audioRecorder = try AVAudioRecorder(url: self.audioFilename, settings: settings)
Run Code Online (Sandbox Code Playgroud)
我希望质量尽可能好,但我希望允许用户在设置中更改质量(如果可以节省空间)。
AVAudioQuality 的不同值实际上有何作用?随着质量的下降,他们会让文件变小吗?采样率也是如此吗?我见过的很多教程都使用 12000 左右的采样率,尽管我知道专业录音通常是 44100,有什么理由不使用 44100 吗?
我正在尝试在我的应用程序中实现一些简单的录音功能,我无法理解这样做.我一直指向这个例子,但我不能让它在XCode中运行,它似乎是用C++编写的.
我需要做的是将音频录制到文件,然后能够在录制时获得录制的当前时间戳.我很感激任何帮助.谢谢!
ios ×3
audio ×2
java ×2
objective-c ×2
swift ×2
.net ×1
android ×1
arrays ×1
avfoundation ×1
bytearray ×1
c# ×1
cocoa ×1
core-audio ×1
javascript ×1
macos ×1
media ×1
naudio ×1
overwrite ×1
qt ×1
qtmultimedia ×1
safari ×1
xcode ×1