有没有人知道如何以编程方式捕获正在播放的声音(即,来自声卡的所有内容,而不是麦克风等输入设备).
我制作了一个录音机应用程序,我想在列表视图中显示录音的持续时间.我保存这样的录音:
MediaRecorder recorder = new MediaRecorder();
recorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
folder = new File(Environment.getExternalStorageDirectory()
+ File.separator + "Audio recordings");
String[] files = folder.list();
int number = files.length + 1;
String filename = "AudioSample" + number + ".mp3";
File output = new File(Environment.getExternalStorageDirectory()
+ File.separator + "Audio recordings" + File.separator
+ filename);
FileOutputStream writer = new FileOutputStream(output);
FileDescriptor fd = writer.getFD();
recorder.setOutputFile(fd);
try {
recorder.prepare();
recorder.start();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
Log.e(LOG_TAG, "prepare() failed");
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
如何获得此文件的持续时间(以秒为单位)? …
我要求允许用户使用他们的麦克风录制音频文件,但它必须在没有闪存的情况下工作,因为它需要在iOS(移动版Safari),Android浏览器或Chrome以及PC/Mac上的现代浏览器上运行.
是否有一个干净,简单的HTML5方法来录制音频和发布到服务器?我找不到任何东西.
有没有办法录制高质量的音频?
我如何阅读用户说的信息?在音频录制应用程序中,您可以看到这样的指示器(我不知道它的正确名称).
我正在使用XNA库录制麦克风输入(我认为这不是特定技术,但它永远不会伤害).每次我得到一个样本,我想计算分贝.我在互联网上做了很多搜索,没有发现坚如磐石的例子......
这是我尝试从样本计算分贝:
double peak = 0;
for (var i = 0; i < _buffer.Length; i = i + 2)
{
var sample = BitConverter.ToInt16(_buffer, i);
if (sample > peak)
peak = sample;
else if (sample < -peak)
peak = -sample;
}
var decibel = (20 * Math.Log10(peak/32768));
Run Code Online (Sandbox Code Playgroud)
如果我将分贝值输出到屏幕,我可以看到值越高越大,因为我说话更柔和.然而,当我绝对安静时,它总是在-40左右徘徊......我认为它会是-90.我必须在上面的块中计算错误?从我在某些网站上看到的内容-40相当于"软谈话"...然而,它完全是安静的.
此外,如果我将麦克风静音,它会直接转到-90.
我做错了吗?
我试图在Android中录制音频,但我遇到了问题.
我有启动和停止按钮,"开始"开始录音,"停止"停止录音.
问题是,当我按下停止按钮时,我的应用程序会记录一条消息"W/MediaRecorder(635):mediarecorder因未处理的事件而消失".(启动功能正确保存音频文件.)
然后,如果我再次按下开始或停止按钮,那么我得到错误消息"A/libc(743):致命信号11(SIGSEGV)在0x00000010(代码= 1),线程743(xample.recorder)"
录音类代码如下:
/**
* Creates a new audio recording at the given path (relative to root of SD card).
*/
public AudioRecorder(String path) {
this.path = sanitizePath(path);
}
private String sanitizePath(String path) {
if (!path.startsWith("/")) {
path = "/" + path;
}
if (!path.contains(".")) {
path += ".3gp";
}
return Environment.getExternalStorageDirectory().getAbsolutePath() + path;
}
public void start() throws IOException {
String state = android.os.Environment.getExternalStorageState();
if(!state.equals(android.os.Environment.MEDIA_MOUNTED)) {
throw new IOException("SD Card is not mounted. It is " …
Run Code Online (Sandbox Code Playgroud) 我正在开发一个Android应用程序,它打开MIC源并记录麦克风的音频.我有另一个单独的线程在后台运行,它清除ArrayList,定期保存麦克风的音频输入(每1秒)
它工作正常约5至7分钟,我得到一个这样的错误信息
Consumer closed input channel or an error occur...
Run Code Online (Sandbox Code Playgroud)
并且应用程序被终止.在收到错误消息之前,它会显示此消息并终止应用程序.如何解决此问题以及可能导致此错误的原因?提前致谢.
05-26 18:51:08.137: INFO/DEBUG(2894): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
05-26 18:51:08.137: INFO/DEBUG(2894): Build fingerprint: 'google/passion_kt/passion:2.3.3/GRI40/49208:user/release-keys'
05-26 18:51:08.137: INFO/DEBUG(2894): pid: 2956, tid: 2956 >>> com.company.app.p2p <<<
05-26 18:51:08.137: INFO/DEBUG(2894): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 45088dbc
05-26 18:51:08.137: INFO/DEBUG(2894): r0 42089000 r1 ffffffff r2 00000000 r3 ffffffff
05-26 18:51:08.137: INFO/DEBUG(2894): r4 20000000 r5 e8001200 r6 40009228 r7 00000001 …
Run Code Online (Sandbox Code Playgroud) 我的应用程序设置为使用AVCaptureSession从摄像机录制视频,但是没有音频.如何录制音频然后将其添加到文件的videoOutput中我需要做什么?这是录制视频的代码:
AVCaptureSession *session = [[AVCaptureSession alloc] init];
[session beginConfiguration];
session.sessionPreset = AVCaptureSessionPresetMedium;
CALayer *viewLayer = self.vImagePreview.layer;
NSLog(@"viewLayer = %@", viewLayer);
AVCaptureVideoPreviewLayer *captureVideoPreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:session];
captureVideoPreviewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
captureVideoPreviewLayer.frame = self.vImagePreview.bounds;
[self.vImagePreview.layer addSublayer:captureVideoPreviewLayer];
AVCaptureDevice *device = [self frontFacingCameraIfAvailable];
NSError *error = nil;
AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error:&error];
if (!input) {
// Handle the error appropriately.
NSLog(@"ERROR: trying to open camera: %@", error);
}
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectoryPath = [paths objectAtIndex:0];
AVCaptureMovieFileOutput *movieFileOutput = [[AVCaptureMovieFileOutput …
Run Code Online (Sandbox Code Playgroud) objective-c audio-recording ios avcapturesession avcapturedevice
我正在开发一个iOS应用程序,其上有一个带麦克风的按钮(以及其他功能).当用户按下麦克风时,它会突出显示,应用程序现在应该开始从设备的麦克风录制声音并发送到服务器(专用于应用程序的服务器,由我知道的人开发,因此我可以影响其设计).
我正在寻找最简单但最坚固的方法,即我不需要开发复杂的流媒体解决方案或VoIP功能,除非它像其他任何东西一样简单.
主要问题是我们不知道用户录制声音的时间长短,但我们希望确保声音连续发送到服务器,我们不希望等到用户完成录制.如果数据以块的形式到达服务器是可以的,但是我们不希望错过用户可能正在记录的任何信息,因此一个块必须在前一个块结束的地方继续,依此类推.
我们的第一个想法是创建例如10秒的声音片段"块"并将它们连续发送到服务器.是否有任何流媒体解决方案更好/更简单,我错过了?
我的问题是,在iOS上解决此任务的最简单但仍然可靠的方法是什么?
是否有办法从AVAudioRecorder的正在运行的录音中提取声音块,而不实际停止录音?
我有一个奇怪的记忆"泄漏" AVAssetWriterInput appendSampleBuffer
.我正在同时写视频和音频,所以我有一个AVAssetWriter
有两个输入,一个用于视频,一个用于音频:
self.videoWriter = [[[AVAssetWriter alloc] initWithURL:[self.currentVideo currentVideoClipLocalURL]
fileType:AVFileTypeMPEG4
error:&error] autorelease];
...
self.videoWriterInput = [AVAssetWriterInput assetWriterInputWithMediaType:AVMediaTypeVideo
outputSettings:videoSettings];
self.videoWriterInput.expectsMediaDataInRealTime = YES;
[self.videoWriter addInput:self.videoWriterInput];
...
self.audioWriterInput = [AVAssetWriterInput assetWriterInputWithMediaType:AVMediaTypeAudio
outputSettings:audioSettings];
self.audioWriterInput.expectsMediaDataInRealTime = YES;
[self.videoWriter addInput:self.audioWriterInput];
Run Code Online (Sandbox Code Playgroud)
我开始写作,表面上的一切都很好.视频和音频被写入并对齐等等.但是,我将我的代码放入分配工具并注意到以下内容:
音频字节将保留在内存中,我将在一秒钟内证明.这是内存中的增长.音频字节仅在我调用后才会释放[self.videoWriter endSessionAtSourceTime:...]
,您会看到内存使用量急剧下降.这是我的音频编写代码,它作为一个块被分派到一个串行队列:
@autoreleasepool
{
// The objects that will hold the audio data
CMSampleBufferRef sampleBuffer;
CMBlockBufferRef blockBuffer1;
CMBlockBufferRef blockBuffer2;
size_t nbytes = numSamples * asbd_.mBytesPerPacket;
OSStatus status = noErr;
status = CMBlockBufferCreateWithMemoryBlock(kCFAllocatorDefault,
data,
nbytes,
kCFAllocatorNull,
NULL,
0,
nbytes,
kCMBlockBufferAssureMemoryNowFlag,
&blockBuffer1); …
Run Code Online (Sandbox Code Playgroud) audio-recording ×10
android ×5
audio ×4
ios ×4
objective-c ×2
c# ×1
cocoa-touch ×1
directx ×1
duration ×1
html5 ×1
ipad ×1
iphone ×1
memory-leaks ×1
microphone ×1
multimedia ×1
winapi ×1