iphone एवी फाउंडेशन, कैप्चरस्टिल इमेज एसिंक्रोनसफ्रॉसीन कनेक्शन पर शटर ध्वनि कैसे बंद करें?




cocoa-touch camera (7)

मैं कैमरे से एक लाइव पूर्वावलोकन के दौरान एक छवि को कैप्चर करने की कोशिश कर रहा हूं, एवी फाउंडेशन कैप्स्टस्टिल्म इमेज एसिंक्रोनसफ्रैम कनेक्शन । अब तक कार्यक्रम अपेक्षित रूप से काम करता है हालांकि, मैं शटर ध्वनि कैसे म्यूट कर सकता हूँ?


मैं इस कोड को स्नैपफिल्म इमेज फ़ंक्शन में इस्तेमाल करके काम करने में सक्षम था और यह आईओएस 8.3 आईफोन 5 पर मेरे लिए पूरी तरह काम करता है। मैंने यह भी पुष्टि की है कि अगर ऐप्पल आपके ऐप को अस्वीकार नहीं करेगा, मेरी)

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

बस अच्छा और अनम्यूट होने पर याद रखें जब आपका ऐप वापस आता है!


मैं जापान में रहता हूं, इसलिए जब मैं सुरक्षा कारणों के लिए तस्वीरें लेता हूं तो मैं ऑडियो को म्यूट नहीं कर सकता। वीडियो में, हालांकि ऑडियो बंद हो जाता है मुझे समझ में नहीं आता कि क्यों

शटर ध्वनि के बिना एक तस्वीर लेने का एकमात्र तरीका 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);

जब मैं CMTimeMake (1, 1) सेट करता हूं तो मेरे 3GS में बहुत भारी होता है; // एक फ्रेम प्रति सेकंड

WWDC 2010 नमूना कोड, FindMyiCone में, मुझे निम्न कोड मिला,

[output setAlwaysDiscardsLateVideoFrames:YES];

जब यह एपीआई उपयोग किया जाता है, तो समय प्रदान नहीं किया जाता है, लेकिन एपीआई क्रमिक रूप से कहा जाता है। मैं यह सबसे अच्छा समाधान है


एकमात्र संभव काम-मैं सोच सकता हूँ कि जब मैं "तस्वीर लेना" बटन दबाएंगे, तो वह ध्वनि की आवाज को मूक करने के लिए, और फिर इसे दूसरी बार बाद में म्यूट कर देगा।


विधि 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];


आप (पूर्ण रिज़ॉल्यूशन नहीं) छवि को कैप्चर करने के लिए एक वीडियो स्ट्रीम से एक फ्रेम भी ले सकते हैं।

इसका संक्षिप्त अंतराल पर चित्रों को कैप्चर करने के लिए यहां उपयोग किया जाता है :

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

मैं आईओएस डीफ़ॉल्ट शटर ध्वनि को कैद करने के लिए एक बार इस कोड का इस्तेमाल किया था (यहां ध्वनि फ़ाइल नामों की सूची है 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];

तब मैंने दस्तावेज़ निर्देशिका (मैक के लिए photoShutter.caf से photoShutter.caf को निकालने के लिए तृतीय-पक्ष ऐप का इस्तेमाल किया। अगले चरण में मैंने ऑडेसिटी ऑडियो संपादक में photoShutter.caf खोला और उलटा प्रभाव लगाया, ऐसा लगता है कि यह उच्च ज़ूम पर है:

तब मैंने इस ध्वनि को photoShutter2.caf रूप में photoShutter2.caf और photoShutter2.caf से पहले इस ध्वनि को सही करने का प्रयास किया:

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:
...

और यह वास्तव में काम करता है! मैं कई बार परीक्षण चलाता हूं, हर बार जब मैं शटर ध्वनि नहीं सुनता हूं :)

आप पहले से उल्टे ध्वनि प्राप्त कर सकते हैं, इस लिंक से आईफोन 5 एस आईओएस 7.1.1 पर कब्जा कर लिया है: https://www.dropbox.com/s/1echsi6ivbb8585/photoShutter2.caf





avfoundation