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




cocoa-touch camera (6)

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


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


ऐसे मामलों में एक आम चाल है यह पता लगाना है कि क्या ढांचे में इस घटना के लिए एक निश्चित विधि का आह्वान किया गया है, और फिर उस विधि को अस्थायी रूप से अधिलेखित करने के लिए, इसके प्रभाव को ध्वस्त करना।

मुझे खेद है, लेकिन अगर मैं इस मामले में काम करता है तो मैं तुरंत आपको बताऊंगा कि मैं काफी हद तक नहीं हूं। आप फ्रेमवर्क निष्पादन योग्य पर "एनएम" कमांड को देखने के लिए कोशिश कर सकते हैं कि क्या नामांकित फ़ंक्शन है जिसमें उपयुक्त नाम है, या यह पता लगाने के लिए सिम्युलेटर के साथ जीडीबी का उपयोग करें जहां यह जाता है।

एक बार जब आप जानते हैं कि क्या अधिलेखित करना है, तो उन निम्न स्तर वाले ObjC प्रेषण कार्य हैं जो फ़ंक्शन के लिए लुकअप को पुनर्निर्देशित करने के लिए उपयोग कर सकते हैं, मुझे विश्वास है। मुझे लगता है कि मैंने कुछ समय पहले एक बार किया है, लेकिन विवरण याद नहीं कर सकते।

उम्मीद है, आप इसके लिए कुछ समाधान पथों को Google के लिए अपने संकेतों का उपयोग कर सकते हैं। सौभाग्य।


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