繁体   English   中英

使用AVFoundation为多张图像播放一次相机声音或者只需以编程方式静音/抑制声音

[英]Playing camera sound only once for for multiple images using AVFoundation OR Simply mute/suppress sound programmatically

关于问题1问题2问题3 ,我在同一平台上有类似的问题。

我正在使用AVFoundation拍摄多张图像(5张图像 - 1.5秒内的突发模式),我能够成功拍摄5张图像,但每次拍摄新图像时都会产生快门声。

我正在使用captureStillImageAsynchronouslyFromConnection来拍摄静止图像。 图像质量/清晰度是我的主要关注点,我不想在图像质量和图像捕获速度上妥协。

我的查询是:

1)我只能播放一次声音吗? 仅适用于第一张图像 ,不适用于所有5张图像。

2)我可以改变快门声,如果是,怎么样?

3)如果包含更改,Apple会批准此类应用吗?

我知道按照第3.3.8节关于快门声音的App Store政策。

用户界面,数据收集,当地法律和隐私:

第3.3.8节:任何形式的用户或设备数据收集,或图像,图片或语音捕获或记录(统称为“记录”),以及任何形式的数据,内容或信息收集,处理,维护,上载,同步,存储通过,通过或与您的应用程序相关的传输,共享,披露或使用必须遵守所有适用的隐私法律和法规以及任何相关的计划要求,包括但不限于任何通知或同意要求。 特别是,作为应用程序的一部分,必须向用户显示相当显着的音频,视觉或其他指示符,以指示正在进行记录。

如果我们可以静音/完全抑制相机快门声音(根本没有声音)也很好。

我已经使用了你在问题1中发布的方法,它就像魔法一样。 所以我强烈建议你按照最佳答案的例子。

关于你的疑问:

1)您只能通过组合包含在布尔中的示例的解决方案来获取第一张图片的声音,该布尔值检查是否已拍摄第一张照片。 例如:

if (hasTakenFirstPicture) {
    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);
} else {
    hasTakenFirstPicture = YES;
}
[self.stillImageOutput captureStillImageAsynchronouslyFromConnection:
...

2)您无法更改默认快门声音。

3) 应用程序商店评论指南没有提及拒绝改变快门声音的应用程序,所以你在这里几乎涵盖了。 如果您提交的应用程序不符合列表中指定的任何条件,他们应该只拒绝您的应用程序。

希望这可以帮助!

在某些国家(比如日本/中国,我认为 )拍照时必须使用快门声。 因此,这可能会使这些国家的应用被拒绝。 或者至少给你带来一些麻烦。

无论哪种方式,一个很好的解决方法,也可以帮助您解决问题,正在做以下事情。 请注意,质量会稍微降低,但需要进行测试以确保:

拍摄视频是另一种解决方案,并拍摄5张视频照片(例如每0.3秒)。 因此,不是拍摄5张照片,而是拍摄1张视频并以编程方式进行编辑。

视频也不需要快门点击,因此您可以以编程方式(使用SystemSounds)播放您想要的任何声音。

用户不会注意到差异,但因为它是视频,质量可能会更低,相机处理图像的方式也可能不同。

我仍然觉得值得尝试:)

我可以使用以下代码以编程方式截取屏幕截图,从而禁用/静音相机快门声音。 确认在iPhone 5上使用iOS8.3并在App Store中接受。 在拍照之前调用此代码:

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;
    }
}

[volumeViewSlider setValue:0.0f animated:YES];
[volumeViewSlider sendActionsForControlEvents:UIControlEventTouchUpInside];

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM