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
Vea esta entrada para un tipo de respuesta diferente: Capture la imagen desde el búfer de imagen. La captura de pantalla durante la vista previa de vídeo falla