AVFoundation, ¿cómo desactivar el sonido del obturador al capturarStillImageAsynchronouslyFromConnection?
Estoy intentando capturar una imagen durante una vista previa en vivo desde la cámara, mediante AVFoundation captureStillImageAsynchronouslyFromConnection . Hasta ahora el programa funciona como se esperaba. Sin embargo, ¿cómo puedo silenciar el sonido del obturador?
Utilicé este código una vez para capturar el sonido del obturador predeterminado de iOS (aquí hay una lista de nombres de archivos de sonido https://github.com/TUNER88/iOSSystemSoundsLibrary ):
NSString *path = @"/System/Library/Audio/UISounds/photoShutter.caf";
NSString *docs = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSData *data = [NSData dataWithContentsOfFile:path];
[data writeToFile:[docs stringByAppendingPathComponent:@"photoShutter.caf"] atomically:YES];
Luego utilicé una aplicación de terceros para extraer photoShutter.caf
del directorio Documentos (DiskAid para Mac). El siguiente paso lo abrí photoShutter.caf
en el editor de audio Audacity y apliqué el efecto de inversión, se ve así con un zoom alto:
Luego guardé este sonido photoShutter2.caf
e intenté reproducirlo justo antes captureStillImageAsynchronouslyFromConnection
:
static SystemSoundID soundID = 0;
if (soundID == 0) {
NSString *path = [[NSBundle mainBundle] pathForResource:@"photoShutter2" ofType:@"caf"];
NSURL *filePath = [NSURL fileURLWithPath:path isDirectory:NO];
AudioServicesCreateSystemSoundID((__bridge CFURLRef)filePath, &soundID);
}
AudioServicesPlaySystemSound(soundID);
[self.stillImageOutput captureStillImageAsynchronouslyFromConnection:
...
¡Y esto realmente funciona! Realizo la prueba varias veces y cada vez no escucho ningún sonido del obturador :)
Puede obtener el sonido ya invertido, capturado en iPhone 5S iOS 7.1.1 desde este enlace: https://www.dropbox.com/s/1echsi6ivbb85bv/photoShutter2.caf
Mi solución en Swift
Cuando llama al AVCapturePhotoOutput.capturePhoto
método para capturar una imagen como el siguiente código.
photoOutput.capturePhoto(with: self.capturePhotoSettings, delegate: self)
Se invocarán los métodos AVCapturePhotoCaptureDelegate. Y el sistema intenta reproducir el sonido del obturador después de willCapturePhotoFor
invocarlo. Así podrás deshacerte del sonido del sistema de willCapturePhotoFor
la forma adecuada.
extension PhotoCaptureService: AVCapturePhotoCaptureDelegate {
func photoOutput(_ output: AVCapturePhotoOutput, willCapturePhotoFor resolvedSettings: AVCaptureResolvedPhotoSettings) {
// dispose system shutter sound
AudioServicesDisposeSystemSoundID(1108)
}
}
Ver también
- AVCapturePhotoDelegate