AVFoundation, ¿cómo desactivar el sonido del obturador al capturarStillImageAsynchronouslyFromConnection?

Resuelto k06a asked hace 54 años • 0 respuestas

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?

k06a avatar Jan 01 '70 08:01 k06a
Aceptado

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.cafdel directorio Documentos (DiskAid para Mac). El siguiente paso lo abrí photoShutter.cafen el editor de audio Audacity y apliqué el efecto de inversión, se ve así con un zoom alto:

ingrese la descripción de la imagen aquí

Luego guardé este sonido photoShutter2.cafe 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

k06a avatar May 20 '2014 11:05 k06a

Mi solución en Swift

Cuando llama al AVCapturePhotoOutput.capturePhotomé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 willCapturePhotoForinvocarlo. Así podrás deshacerte del sonido del sistema de willCapturePhotoForla forma adecuada.

ingrese la descripción de la imagen aquí

extension PhotoCaptureService: AVCapturePhotoCaptureDelegate {

    func photoOutput(_ output: AVCapturePhotoOutput, willCapturePhotoFor resolvedSettings: AVCaptureResolvedPhotoSettings) {
        // dispose system shutter sound
        AudioServicesDisposeSystemSoundID(1108)
    }
}

Ver también

  • AVCapturePhotoDelegate
Won avatar Mar 19 '2019 07:03 Won