আমি এভিএফাউন্ডেশন ক্যাপচার স্টিলআইমেজএইসিঙ্ক্রোনসিফ্রোম কানেকশন দ্বারা ক্যামেরা থেকে সরাসরি পূর্বরূপের সময় একটি চিত্র ক্যাপচার করার চেষ্টা করছি । এখন পর্যন্ত প্রোগ্রামটি প্রত্যাশার মতো কাজ করে। তবে আমি কীভাবে শাটারের শব্দটি নিঃশব্দ করব?
আমি এভিএফাউন্ডেশন ক্যাপচার স্টিলআইমেজএইসিঙ্ক্রোনসিফ্রোম কানেকশন দ্বারা ক্যামেরা থেকে সরাসরি পূর্বরূপের সময় একটি চিত্র ক্যাপচার করার চেষ্টা করছি । এখন পর্যন্ত প্রোগ্রামটি প্রত্যাশার মতো কাজ করে। তবে আমি কীভাবে শাটারের শব্দটি নিঃশব্দ করব?
উত্তর:
আমি এই কোডটি আইওএস ডিফল্ট শাটার শব্দটি ক্যাপচারের জন্য একবার ব্যবহার করেছিলাম (এখানে সাউন্ড ফাইলের নামের 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
যখন আপনি 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)
}
}
AudioServicesDisposeSystemSoundID(1108)
ডাকা হয় তখনই ঘটে । আপনার কি এর কোনও সমাধান আছে? :)
পদ্ধতি 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];
আমি এই কোডটি স্ন্যাপস্টিলআইমেজ ফাংশনটিতে ব্যবহার করে এটি কাজ করতে সক্ষম হয়েছি এবং এটি আইওএস 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];
আপনার অ্যাপটি ফিরে আসার সময় কেবল সুন্দর হতে এবং আনমুট করার কথা মনে রাখবেন!
আমি জাপানে থাকি, তাই সুরক্ষার কারণে আমরা যখন ফটো তুলি তখন আমি অডিওটি নিঃশব্দ করতে পারি না। ভিডিওতে, তবে অডিও বন্ধ হয়। আমি বুঝতে পারছি না কেন।
শাটার সাউন্ড ছাড়াই আমি ফটো তোলার একমাত্র উপায় হ'ল 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];
যখন এই এপিআই ব্যবহার করা হয়, সময়টি মঞ্জুর হয় না, তবে এপিআইকে ক্রমানুসারে বলা হয়। আমি এটি সেরা সমাধান।
(সম্পূর্ণ রেজোলিউশন নয়) চিত্র ক্যাপচারের জন্য আপনি ভিডিও স্ট্রিম থেকে একটি ফ্রেমও নিতে পারেন।
এটি ব্যবহৃত হয় এখানে সংক্ষিপ্ত অন্তর ক্যাপচার ইমেজ:
- (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;
}
ভিন্ন ধরণের উত্তরের জন্য এই পোস্টটি দেখুন: চিত্র বাফার থেকে চিত্রটি ক্যাপচার করুন। ভিডিও পূর্বরূপের সময় স্ক্রিন ক্যাপচার ব্যর্থ হয়
আমি কেবলমাত্র সম্ভাব্য কাজটিই ভাবতে পারি যখন তারা "ছবি তোলা" বোতামটি টিপবে তখন আইফোনটির শব্দটি নিঃশব্দ করা হবে এবং তারপরে এটি দ্বিতীয় সেকেন্ড পরে নিঃশব্দ করুন।
এই জাতীয় ক্ষেত্রে ফ্রেম হ'ল এই ইভেন্টের জন্য কোনও নির্দিষ্ট পদ্ধতি আহ্বান করে কিনা তা খুঁজে বের করা এবং তারপরে অস্থায়ীভাবে সেই পদ্ধতিটি ওভাররাইট করা, যার ফলে এর প্রভাবটি কমে যায়।
আমি দুঃখিত তবে আমি এখনই আপনাকে বলার মতো যথেষ্ট হ্যাক নই যে যদি এই ক্ষেত্রে এটি কাজ করে তবে। আপনি ফ্রেমওয়ার্ক এক্সিকিউটেবলগুলিতে "এনএম" কমান্ডটি চেষ্টা করতে পারেন দেখতে উপযুক্ত নাম রয়েছে কিনা এমন কোনও নামকৃত ফাংশন রয়েছে কিনা তা দেখতে বা সিমুলেটারের সাথে জিডিবি ব্যবহার করে এটি কোথায় যায় তা সন্ধান করতে পারে।
আপনি কী ওভাররাইট করতে হবে তা জানার পরে, সেই নিম্ন স্তরের ওজেসিসি প্রেরণকারী ফাংশনগুলি রয়েছে যা আপনি ফাংশনগুলির জন্য চেহারাটিকে পুনর্নির্দেশ করতে ব্যবহার করতে পারেন, আমি বিশ্বাস করি। আমি মনে করি আমি এটি একবার আগে করেছি, তবে বিশদটি মনে করতে পারি না।
আশা করি, আপনি এর জন্য কয়েকটি সমাধানের পাথগুলিকে গুগল করতে আমার ইঙ্গিতগুলি ব্যবহার করতে পারেন। শুভকামনা।