এভিফাউন্ডেশন, ক্যাপচার স্টিলআইমেজএএসসিঙ্ক্রোনসিফর্ম সংযোগটি কীভাবে শাটারের শব্দটি বন্ধ করবেন?


90

আমি এভিএফাউন্ডেশন ক্যাপচার স্টিলআইমেজএইসিঙ্ক্রোনসিফ্রোম কানেকশন দ্বারা ক্যামেরা থেকে সরাসরি পূর্বরূপের সময় একটি চিত্র ক্যাপচার করার চেষ্টা করছি । এখন পর্যন্ত প্রোগ্রামটি প্রত্যাশার মতো কাজ করে। তবে আমি কীভাবে শাটারের শব্দটি নিঃশব্দ করব?


4
জাপানে উদাহরণস্বরূপ আপনি এটি করতে পারবেন না। আপনি ফোনটি নিঃশব্দ করা সত্ত্বেও শাটারের শব্দটি সর্বদা বাজে। (গোপনীয়তা লঙ্ঘন প্রতিরোধের কিছু অদ্ভুত নিয়ম, উর্পা আপস্ক্রিট ফটোগ্রাফি যতদূর আমি জানি জাপানে রয়েছে) সুতরাং আমি মনে করি না এটি করার কোনও উপায় আছে।
ডানক্লেস্টন

4
হ্যাঁ, এটি হতে পারে আপনার আইফোন নিঃশব্দ ক্যামেরা শটগুলির জন্য অনুমতি দেয় না। আমি মার্কিন যুক্তরাষ্ট্রে আছি এবং আমি ফোনটি নিঃশব্দে রেখে কোনও ছবি তুললে আমার আইফোন কোনও শব্দ দেয় না; অন্যদিকে, আমার বান্ধবী একটি শব্দ করে তোলে (তার কোরিয়া থেকে এসেছে)।
donkim

4
পরিষ্কার হয়ে উঠতে, ফোনটি যখন নিঃশব্দ / ভাইব্রেড মোডে না হয় তার জন্য এটি একটি সমাধান। সেই মোডে, ছবি তোলার সময় কোনও শব্দ হয় না।
নিউ আলেকজান্দ্রিয়া

31
@ নিউ অ্যালেক্সান্দ্রিয়া আমি জাপানের শাটারে ভাইব্রেশন মোডে শুনেছি। এটি আইনের প্রয়োজনীয়তা।
k06a

4
ডিভাইস নিঃশব্দ করা থাকলে বিটিডব্লিউ অডিও সার্ভিসপ্লেসিস্টেমসাউন্ড চলবে না। সুতরাং জাপানি ডিভাইসগুলি নিঃশব্দ হওয়ার পরেও একটি শব্দ তৈরি করবে, তবে যখন নিঃশব্দ করা হবে না ...
ফিলিপ রেডেলিক

উত্তর:


1500

আমি এই কোডটি আইওএস ডিফল্ট শাটার শব্দটি ক্যাপচারের জন্য একবার ব্যবহার করেছিলাম (এখানে সাউন্ড ফাইলের নামের 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ডকুমেন্টস ডিরেক্টরি (ম্যাকের জন্য ডিস্কএইড) থেকে নিষ্কাশন করতে তৃতীয় পক্ষের অ্যাপ্লিকেশন ব্যবহার করেছি used পরবর্তী ধাপে আমি photoShutter.cafঅড্যাসিটি অডিও সম্পাদকটিতে খুললাম এবং বিপরীত প্রভাব প্রয়োগ করেছি, এটি উচ্চ জুমের মতো দেখাচ্ছে:

এখানে চিত্র বর্ণনা লিখুন

তারপরে আমি এই শব্দটি সংরক্ষণ করেছিলাম photoShutter2.cafএবং এই শব্দটি ঠিক আগে চালানোর চেষ্টা করেছি 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:
...

এবং এটি সত্যিই কাজ করে! আমি বেশ কয়েকবার পরীক্ষা চালিয়েছি, যতবারই আমি কোনও শাটার শব্দ শুনি না :)

আপনি ইতিমধ্যে এই লিঙ্কটি থেকে আইফোন 5 এস আইওএস 7.1.1 এ বন্দি শব্দটি পেতে পারেন: https : //www.DPboxboxss/1echsi6ivbb85bv/photoShutter2.caf


104
খুব ঠান্ডা. কেবলমাত্র সতর্কতাটি হ'ল ফ্ল্যাশ চালু হওয়ার পরে এটি ডাবল শাটার শব্দের ফলশ্রুতিতে পারে কারণ ক্যাপচারস্টিলিমেজএজিনক্রোনার্সফ্রম সংযোগ: কল করার সময় ডিফল্ট সিস্টেমের শব্দটি বাজানো হয় না, বরং চিত্রটি আসলে ক্যাপচার হওয়ার সময় (ফ্ল্যাশ ক্রমের সময়) হয়। পরিবর্তে যখন ক্যাপচার শুরু হয় তখন সনাক্ত করতে কীপথ 'ক্যাপচারিং স্টিলআইমেজ'-এর জন্য সেলফ.স্টিলআইমেজআউটপুটে একটি কী-মান পর্যবেক্ষক যুক্ত করুন, তারপরে কলব্যাক পদ্ধতিতে বিপরীত শব্দটি খেলুন।
জেফ মাসিয়া

16
এভাবেই আধুনিক সামরিক বিমানগুলি রাডারকে পরাজিত করে। এই কারণেই আপনি নতুন যোদ্ধাদের নকশায় "স্টিলথ শেপ" সিলুয়েটটি দেখতে পাচ্ছেন না: এখানে একটি বৈদ্যুতিন প্যাকেজ রয়েছে যা মূলত একটি রাডার-পরাস্তকরণের পর্যায় শিফট যা একটি "ইনভার্টেড" (পর্যায় স্থানান্তরিত) সদৃশ সংকেত প্রচার করে।
L0j1k

4
@ L0j1k: আপনি কী ধরণের স্টিলথ জাহাজের কথা বলছেন তা নির্ভর করে। F22 একটি মানুষ অনিচ্ছুক না হয়ে অন্বেষণযোগ্য হতে আগ্রহী। ফেজ শিফট প্রযুক্তিতে সমস্যা হ'ল আপনি অন্যান্য অবস্থান থেকে অবিশ্বাস্যভাবে স্পষ্ট, যেহেতু তারা একই শিফটটি দেখতে পাবেন না।
গুভান্তে

13
রিয়েলটাইমে শব্দটি ক্যাপচার করা বাদ দিয়ে
শোনানো

4
এটি iOS7 এর জন্য দুর্দান্ত ছিল তবে এটি iOS8 এ আর কাজ করে না, কীভাবে আইওএস 8 এ এটি সমাধান করবেন?
টিকো

36

সুইফটে আমার সলিউশন

যখন আপনি AVCapturePhotoOutput.capturePhotoনীচের কোডের মতো কোনও চিত্র ক্যাপচারের জন্য পদ্ধতিটি কল করবেন ।

photoOutput.capturePhoto(with: self.capturePhotoSettings, delegate: self)

AVCapturePhotoCaptureDelegate পদ্ধতি চালু করা হবে। এবং সিস্টেমটি চাওয়ার পরে শাটার শব্দ বাজানোর চেষ্টা করে willCapturePhotoFor। সুতরাং আপনি willCapturePhotoForপদ্ধতিতে সিস্টেম শব্দ নিষ্পত্তি করতে পারেন ।

এখানে চিত্র বর্ণনা লিখুন

extension PhotoCaptureService: AVCapturePhotoCaptureDelegate {

    func photoOutput(_ output: AVCapturePhotoOutput, willCapturePhotoFor resolvedSettings: AVCaptureResolvedPhotoSettings) {
        // dispose system shutter sound
        AudioServicesDisposeSystemSoundID(1108)
    }
}

আরো দেখুন


4
এটি একটি সুন্দর সমাধান এবং এটি নিখুঁতভাবে কাজ করে। দুর্দান্ত উত্তর। ধন্যবাদ @kyle
Warpling

4
এটি পুরোপুরি কাজ। আপনার যদি নীরব মোড এবং স্বাভাবিক মোড পৃথক করতে হয় তবে বিপরীতভাবে অডিও সার্ভিসপ্লেসাইমসাউন্ডআইডি (1108) ব্যবহার করুন। ধন্যবাদ.
এমজে স্টুডিও

4
এটি কাজ করে! আমি জানতে চাই যে এই জাতীয় পদ্ধতিতে অ্যাপস্টোরে আপলোড করতে আপনার কোনও সমস্যা আছে কিনা?
জুন টুং

4
@ ল্যুইজুনটং এই সমাধানে কোনও সমস্যা নেই। আমি ইতিমধ্যে এই সমাধান সহ অ্যাপস আপলোড করেছি uploaded এই ধরণের সমাধান ব্যবহার করে এমন অনেকগুলি অ্যাপ রয়েছে। শুভ কোডিং।
23:25

আমি একটি সমস্যা আবিষ্কার করেছি। আপনি যদি এই সমস্যাটি আবিষ্কার করেন তবে আমি ভাবছি। এটি মূলত একটি মেমরি ফুটো যা কেবল যখন AudioServicesDisposeSystemSoundID(1108)ডাকা হয় তখনই ঘটে । আপনার কি এর কোনও সমাধান আছে? :)
লিউ জুন জুন তুং

21

পদ্ধতি 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);

আপনার যদি প্রয়োজন হয় তবে এখানে একটি ফাঁকা অডিও ফাইল। https://d1sz9tkli0lfjq.cloudfront.net/items/0Y3Z0A1j1H2r1c0z3n3t/blank.wav

________________________________________________________________________________________________________________________________________

পদ্ধতি 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];

4
আমি মনে করি না এটি কাজ করবে, শাটারের শব্দটি বাজানোর সময় এটি কেবল একটি "ফাঁকা" শব্দ বাজবে। একই সাথে 2 টি শব্দ বাজানো এটি বেশ সম্ভব। অন্যান্য 2 টি পদ্ধতি কার্যকর বলে মনে হচ্ছে!
লিনাক্সমিন্ট

4
ইহাকে একটি লাথি দাও. আমি বিশ্বাস করি না এটি কার্যকর হবে, তবে এখানে আশা করা যায়!
sudo rm -rf

7

আমি এই কোডটি স্ন্যাপস্টিলআইমেজ ফাংশনটিতে ব্যবহার করে এটি কাজ করতে সক্ষম হয়েছি এবং এটি আইওএস 8.3 আইফোন 5 এ আমার জন্য পুরোপুরি কাজ করে 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];

আপনার অ্যাপটি ফিরে আসার সময় কেবল সুন্দর হতে এবং আনমুট করার কথা মনে রাখবেন!


5

আমি জাপানে থাকি, তাই সুরক্ষার কারণে আমরা যখন ফটো তুলি তখন আমি অডিওটি নিঃশব্দ করতে পারি না। ভিডিওতে, তবে অডিও বন্ধ হয়। আমি বুঝতে পারছি না কেন।

শাটার সাউন্ড ছাড়াই আমি ফটো তোলার একমাত্র উপায় হ'ল 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);

আমার থ্রিজিএসে যখন আমি সিএমটাইমমেক (1, 1) সেট করি তখন খুব ভারী হয়; // প্রতি ফ্রেমে এক ফ্রেম।

ডাব্লুডাব্লুডিসি 2010 স্যাম্পল কোড, ফাইন্ড মাইকোন, আমি নিম্নলিখিত কোড পেয়েছি,

[output setAlwaysDiscardsLateVideoFrames:YES];

যখন এই এপিআই ব্যবহার করা হয়, সময়টি মঞ্জুর হয় না, তবে এপিআইকে ক্রমানুসারে বলা হয়। আমি এটি সেরা সমাধান।


3

(সম্পূর্ণ রেজোলিউশন নয়) চিত্র ক্যাপচারের জন্য আপনি ভিডিও স্ট্রিম থেকে একটি ফ্রেমও নিতে পারেন।

এটি ব্যবহৃত হয় এখানে সংক্ষিপ্ত অন্তর ক্যাপচার ইমেজ:

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

আপনি যখন AVCaptureMovieFileOutput ব্যবহার করা হচ্ছে তখন কাজের জন্য AVCaptureVideoDataOutput পেতে সক্ষম হন? আমি যখন দু'টিই ব্যবহার করার চেষ্টা করি তখন AVCaptureVideoDataOutput এর প্রতিনিধি পদ্ধতিগুলি কল করা হয় না।
পল সেজান

দুঃখিত, আমি একই সাথে একাধিক আউটপুট দেওয়ার চেষ্টা করিনি।
রিভেরা


0

আমি কেবলমাত্র সম্ভাব্য কাজটিই ভাবতে পারি যখন তারা "ছবি তোলা" বোতামটি টিপবে তখন আইফোনটির শব্দটি নিঃশব্দ করা হবে এবং তারপরে এটি দ্বিতীয় সেকেন্ড পরে নিঃশব্দ করুন।


কীভাবে আইফোন সাউন্ড প্রোগ্রামেটিকভাবে নিঃশব্দ করবেন? ধন্যবাদ!
ওহহো

আপনি যদি পারতেন

0

এই জাতীয় ক্ষেত্রে ফ্রেম হ'ল এই ইভেন্টের জন্য কোনও নির্দিষ্ট পদ্ধতি আহ্বান করে কিনা তা খুঁজে বের করা এবং তারপরে অস্থায়ীভাবে সেই পদ্ধতিটি ওভাররাইট করা, যার ফলে এর প্রভাবটি কমে যায়।

আমি দুঃখিত তবে আমি এখনই আপনাকে বলার মতো যথেষ্ট হ্যাক নই যে যদি এই ক্ষেত্রে এটি কাজ করে তবে। আপনি ফ্রেমওয়ার্ক এক্সিকিউটেবলগুলিতে "এনএম" কমান্ডটি চেষ্টা করতে পারেন দেখতে উপযুক্ত নাম রয়েছে কিনা এমন কোনও নামকৃত ফাংশন রয়েছে কিনা তা দেখতে বা সিমুলেটারের সাথে জিডিবি ব্যবহার করে এটি কোথায় যায় তা সন্ধান করতে পারে।

আপনি কী ওভাররাইট করতে হবে তা জানার পরে, সেই নিম্ন স্তরের ওজেসিসি প্রেরণকারী ফাংশনগুলি রয়েছে যা আপনি ফাংশনগুলির জন্য চেহারাটিকে পুনর্নির্দেশ করতে ব্যবহার করতে পারেন, আমি বিশ্বাস করি। আমি মনে করি আমি এটি একবার আগে করেছি, তবে বিশদটি মনে করতে পারি না।

আশা করি, আপনি এর জন্য কয়েকটি সমাধানের পাথগুলিকে গুগল করতে আমার ইঙ্গিতগুলি ব্যবহার করতে পারেন। শুভকামনা।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.