sonido silenciar quitarle quitar puedo plus para desactivar dela como camara app activar iphone cocoa-touch camera avfoundation

iphone - silenciar - AVFoundation, cómo apagar el sonido del obturador cuando captureStillImageAsynchronouslyFromConnection?



desactivar sonido camara iphone 7 (8)

El único trabajo posible en torno a lo que se me ocurre sería silenciar el sonido del iphone cuando presionan el botón "tomar foto", y luego desmutarlo un segundo más tarde.

Estoy intentando capturar una imagen durante una vista previa viva de la cámara, por AVFoundation captureStillImageAsynchronouslyFromConnection . Hasta ahora el programa funciona como se esperaba. Sin embargo, ¿cómo puedo silenciar el sonido del obturador?


Un truco común en tales casos es averiguar si el framework invoca un cierto método para este evento, y luego sobrescribir ese método temporalmente, con lo que se anula su efecto.

Lo siento, pero no soy lo suficientemente bueno como para decirte de inmediato si eso funciona en este caso. Puede probar el comando "nm" en los ejecutables del marco para ver si hay una función con nombre que tiene un nombre adecuado o usar gdb con el Simulador para rastrear dónde va.

Una vez que sepas qué sobrescribir, hay esas funciones de despacho de bajo nivel de ObjC que puedes usar para redirigir la búsqueda de funciones, creo. Creo que lo he hecho una vez hace un tiempo, pero no puedo recordar los detalles.

Con suerte, puede utilizar mis sugerencias para google algunas rutas de soluciones a esto. Buena suerte.


Vivo en Japón, así que no puedo silenciar el audio cuando tomamos fotos por razones de seguridad. En vídeo, sin embargo el audio se apaga. No entiendo por qué.

La única manera de tomar una foto sin sonido de obturador es utilizando AVCaptureVideoDataOutput o AVCaptureMovieFileOutput. Para analizar la imagen fija AVCaptureVideoDataOutput es la única manera. En el código de ejemplo AVFoundatation,

AVCaptureVideoDataOutput *output = [[[AVCaptureVideoDataOutput alloc] init] autorelease]; // If you wish to cap the frame rate to a known value, such as 15 fps, set // minFrameDuration. output.minFrameDuration = CMTimeMake(1, 15);

En mi 3GS es muy pesado cuando pongo CMTimeMake (1, 1); // Un fotograma por segundo.

En WWDC 2010 código de ejemplo, FindMyiCone, encontré código siguiente,

[output setAlwaysDiscardsLateVideoFrames:YES];

Cuando se utiliza esta API, la temporización no se concede, pero la API se llama secuencialmente. Yo esto es las mejores soluciones.


Método 1: No está seguro de si esto funcionará, pero intente reproducir un archivo de audio en blanco justo antes de enviar el evento de captura.

Para reproducir un clip, agregue el marco de Audio Toolbox , #include <AudioToolbox/AudioToolbox.h> y reproduzca el archivo de audio de esta forma inmediatamente antes de tomar la fotografía:

NSString *path = [[NSBundle mainBundle] pathForResource:@"blank" ofType:@"wav"]; SystemSoundID soundID; NSURL *filePath = [NSURL fileURLWithPath:path isDirectory:NO]; AudioServicesCreateSystemSoundID((CFURLRef)filePath, &soundID); AudioServicesPlaySystemSound(soundID);

Aquí hay un archivo de audio en blanco si lo necesita. http://cl.ly/3cKi

________________________________________________________________________________________________________________________________________

Método 2: También hay una alternativa si esto no funciona. Mientras no necesite tener una buena resolución, puede tomar un marco de la secuencia de vídeo , evitando así el sonido de la imagen por completo.

________________________________________________________________________________________________________________________________________

Método 3: Otra forma de hacer esto sería tomar una "captura de pantalla" de su aplicación. Hacerlo de esta forma:

UIGraphicsBeginImageContext(self.window.bounds.size); [self.window.layer renderInContext:UIGraphicsGetCurrentContext()]; UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); NSData * data = UIImagePNGRepresentation(image); [data writeToFile:@"foo.png" atomically:YES];

Si quieres esto para llenar toda la pantalla con una vista previa de la secuencia de vídeo para que su captura de pantalla se ve bien:

AVCaptureSession *captureSession = yourcapturesession; AVCaptureVideoPreviewLayer *previewLayer = [AVCaptureVideoPreviewLayer layerWithSession:captureSession]; UIView *aView = theViewYouWantTheLayerIn; previewLayer.frame = aView.bounds; // Assume you want the preview layer to fill the view. [aView.layer addSublayer:previewLayer];


También puede tomar un marco de una secuencia de vídeo para capturar una imagen (no de resolución completa).

Se utiliza aquí para capturar imágenes a intervalos cortos:

- (IBAction)startStopPictureSequence:(id)sender { if (!_capturingSequence) { if (!_captureVideoDataOutput) { _captureVideoDataOutput = [AVCaptureVideoDataOutput new]; _captureVideoDataOutput.videoSettings = @{(NSString *)kCVPixelBufferPixelFormatTypeKey: @(kCVPixelFormatType_32BGRA)}; [_captureVideoDataOutput setSampleBufferDelegate:self queue:dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0)]; if (_sequenceCaptureInterval == 0) { _sequenceCaptureInterval = 0.25; } } if ([_captureSession canAddOutput:_captureVideoDataOutput]) { [_captureSession addOutput:_captureVideoDataOutput]; _lastSequenceCaptureDate = [NSDate date]; // Skip the first image which looks to dark for some reason _sequenceCaptureOrientation = (_currentDevice.position == AVCaptureDevicePositionFront ? // Set the output orientation only once per sequence UIImageOrientationLeftMirrored : UIImageOrientationRight); _capturingSequence = YES; } else { NBULogError(@"Can''t capture picture sequences here!"); return; } } else { [_captureSession removeOutput:_captureVideoDataOutput]; _capturingSequence = NO; } } - (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection { // Skip capture? if ([[NSDate date] timeIntervalSinceDate:_lastSequenceCaptureDate] < _sequenceCaptureInterval) return; _lastSequenceCaptureDate = [NSDate date]; UIImage * image = [self imageFromSampleBuffer:sampleBuffer]; NBULogInfo(@"Captured image: %@ of size: %@ orientation: %@", image, NSStringFromCGSize(image.size), @(image.imageOrientation)); // Execute capture block dispatch_async(dispatch_get_main_queue(), ^ { if (_captureResultBlock) _captureResultBlock(image, nil); }); } - (BOOL)isRecording { return _captureMovieOutput.recording; }


Pude conseguir esto para trabajar usando este código en la función snapStillImage y funciona perfectamente para mí en iOS 8.3 iPhone 5. También he confirmado que Apple no rechazará su aplicación si utiliza esto (no rechazaron mía)

MPVolumeView* volumeView = [[MPVolumeView alloc] init]; //find the volumeSlider UISlider* volumeViewSlider = nil; for (UIView *view in [volumeView subviews]){ if ([view.class.description isEqualToString:@"MPVolumeSlider"]){ volumeViewSlider = (UISlider*)view; break; } } // mute it here: [volumeViewSlider setValue:0.0f animated:YES]; [volumeViewSlider sendActionsForControlEvents:UIControlEventTouchUpInside];

Sólo recuerda ser agradable y activar el sonido cuando tu aplicación vuelva.


Utilicé este código una vez para capturar el sonido del obturador predeterminado de iOS (aquí está la 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 de documentos (DiskAid para Mac). El paso siguiente abrió photoShutter.caf en el editor de audio de Audacity y el efecto de inversión aplicado, se ve así en el zoom alto:

Entonces photoShutter2.caf este sonido como photoShutter2.caf e intenté jugar este sonido justo antes de 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! Ejecuto la prueba varias veces, cada vez que no oigo el sonido del obturador :)

Usted puede obtener ya el sonido invertido, capturado en iPhone 5S iOS 7.1.1 desde este enlace: https://www.dropbox.com/s/1echsi6ivbb85bv/photoShutter2.caf