[Ios] AVFoundation,captureStillImageAsynchronouslyFromConnection时如何关闭快门声音?


Answers

方法1:不确定这是否可行,但在发送捕获事件之前尝试播放空白音频文件。

要播放剪辑,请添加Audio Toolbox框架, #include <AudioToolbox/AudioToolbox.h> ,然后在拍摄照片之前立即播放音频文件:

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

如果你需要的话,这是一个空白的音频文件。 http://cl.ly/3cKi

________________________________________________________________________________________________________________________________________

方法2:如果这不起作用,也有其他选择。 只要你不需要有一个好的分辨率,你可以从视频流中抓取一帧 ,从而完全避免图像声音。

________________________________________________________________________________________________________________________________________

方法3:另一种方法是获取应用程序的“截图”。 这样做:

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

如果您希望这样做,可以在整个屏幕上预览视频流,以便您的屏幕截图看起来不错:

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];
Question

我试图通过AVFoundation captureStillImageAsynchronouslyFromConnection从相机实时预览捕获图像。 到目前为止,该计划按预期工作。 但是,我怎样才能使快门声音静音?







我住在日本,所以出于安全原因拍照时我不能将音频静音。 在视频中,音频关闭。 我不明白为什么。

拍摄没有快门声的照片的唯一方法是使用AVCaptureVideoDataOutput或AVCaptureMovieFileOutput。 用于分析静态图像AVCaptureVideoDataOutput是唯一的方法。 在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);

在我的3GS中,当我设置CMTimeMake(1,1)时,它非常重。 //每秒一帧。

在WWDC 2010示例代码FindMyiCone中,我找到了以下代码,

[output setAlwaysDiscardsLateVideoFrames:YES];

当使用此API时,时序不会被授予,但API会被顺序调用。 我这是最好的解决方案。




在这种情况下,常见的技巧是找出框架是否为该事件调用某种方法,然后暂时覆盖该方法,从而消除其影响。

我很抱歉,但如果在这种情况下可行,我不会马上告诉你。 您可以在框架可执行文件上尝试“nm”命令,以查看是否存在具有适合名称的命名函数,或者在模拟器中使用gdb来跟踪它的发生位置。

一旦你知道要覆盖什么,我相信有一些低级的ObjC调度函数可以用来重定向函数的查找。 我想我以前曾经这样做过,但不记得细节。

希望你可以使用我的提示谷歌几个解决方案的路径。 祝你好运。