2011-04-18 19 views
6

के साथ कैमरा स्विच पर फ्रीज करता है मैंने वीडियो को कैप्चर और सहेजने के लिए एक सुविधा के साथ एक ऐप बनाया है। मैंने इसके लिए AVFoundation का उपयोग किया है और Apple's AVCam मेरी मार्गदर्शिका रही है।वीडियो AVFoundation

मुझे लगता है मैं यह स्पष्ट कर सकते हैं आशा:
सब कुछ ठीक काम करता है जब तक मैं videoViewController कि पहली बार के लिए AVCamCaptureManager संभालती रिलीज (कि AVCamViewController होगा AVCam में)। उसके बाद जब मैं इसे फिर से बनाउंगा, तो कैमरा स्विच के बाद वीडियो फ्रीज हो जाएगा। यहां तक ​​कि पुनः चलाने से भी मदद नहीं मिलेगी, न ही साफ हो जाएगी, या डिवाइस रीसेट हो जाएगा। (कभी-कभी चीजों में से एक मदद करता है, लेकिन यह एक नियम नहीं है)।

स्मृति को सहेजने के लिए आवश्यक नहीं होने पर मैं VideoViewController को रिलीज़ करता हूं।

कोड के लिए कैमरा स्विच करने मूल रूप से AVCam में रूप में ही है:,

NSError *error; 
AVCaptureDeviceInput *newVideoInput; 
AVCaptureDevicePosition position = currentVideoInput.device.position; 

if (position == AVCaptureDevicePositionBack) 
    newVideoInput = [[AVCaptureDeviceInput alloc] initWithDevice:frontFacingCamera error:&error]; 
else if (position == AVCaptureDevicePositionFront) 
    newVideoInput = [[AVCaptureDeviceInput alloc] initWithDevice:backFacingCamera error:&error]; 

if (newVideoInput != nil) { 
    [session beginConfiguration]; 
    [session removeInput:currentVideoInput]; 
    if ([session canAddInput:newVideoInput]) { 
     [session addInput:newVideoInput]; 
     [self setVideoInput:newVideoInput]; 
} else { 
    [session addInput:currentVideoInput]; 
} 
    [session commitConfiguration]; 
    [newVideoInput release]; 
} else if (error) { 
    NSLog(@"%@",[error localizedDescription]); 
} 

कोड जिसके साथ मैं videoView खारिज

[self.videoViewController.view removeFromSuperview]; 
self.videoViewController = nil; 

मेरे वर्तमान "वैकल्पिक हल" बस यह हो छोड़ने के लिए है भी अगर मुझे इसकी ज़रूरत नहीं है।

क्या कोई यह समझा सकता है कि यह क्यों हो रहा है और इसे कैसे हल किया जाए।

संपादित करें: हल
डब्ल्यू डायसन के रूप में अपने जवाब में कहा मैं बहुत तरह मेरे videoViewController छोड़ने से पहले सत्र बंद कर दिया जाना चाहिए था:

[[[self.videoViewController captureManager] session] stopRunning]; 
[self.videoViewController.view removeFromSuperview]; 
self.videoViewController = nil; 

डब्ल्यू डायसन धन्यवाद।

उत्तर

3

क्या आपको त्रुटि लॉग मिल रहे हैं? यदि नहीं, तो आपको उपरोक्त कोड को ठीक करने और वे क्या कहते हैं उसे देखने की आवश्यकता है। एवीकैम का आप किस संस्करण का उपयोग कर रहे हैं? उन्होंने हाल ही में प्रोजेक्ट को संस्करण 1.2 में अपडेट किया है, जो कि अधिक कुशल और ब्लॉक का उपयोग करता है।

मेरे अनुभव से, आपको सत्र बनाने और पुनर्निर्माण नहीं करना चाहिए, आप इसे छोड़ सकते हैं। शायद आपको अपने ऐप को थोड़ा अलग तरीके से ढूढ़ने की जरूरत है। आपका ऐप वास्तव में क्या है? शायद हम आपकी मदद कर सकते हैं। यदि आपका ऐप कैमरे के चारों ओर केंद्रित है, तो सत्र को छोड़ना आसान है, अगर आप वीडियो को सामान्य रूप से लेते हैं, तो शायद एवीकैम का उपयोग करना अधिक है।

आपकी वास्तविक समस्या, मुझे लगता है जैसे यह AVCaptureDeviceInput के साथ है। मूल AVCam पैकेज डाउनलोड करें और देखें कि क्या आपने बयान जारी किए हैं या सुरक्षा को बदल दिया है या नहीं। यदि कोई अन्य कोड है, तो कृपया पोस्ट करें।

अद्यतन: यदि आप

} else if (error) { 
    NSLog(@"%@",[error localizedDescription]); 
} 

को
} if (error) { 
    NSLog(@"%@",[error localizedDescription]); 
} 

बदल सकते हैं और मुझे बताओ कि उसमें कोई त्रुटि है, तो कर सकते हैं?

इसके अलावा, सत्र के मालिक होने वाले दृश्य नियंत्रक को छोड़ने से पहले, सुनिश्चित करें कि आप सत्र को रोकें और कैप्चर प्रबंधक को शून्य पर सेट करें।

अद्यतन 2: इस टॉगल कोड को आजमाएं। मैं यही उपयोग कर रहा हूं।

enum { 
    AVCamMirroringOff = 1, 
    AVCamMirroringOn = 2, 
    AVCamMirroringAuto = 3 
}; 
typedef NSInteger AVCamMirroringMode; 


- (BOOL) toggleCamera 
{ 
    BOOL success = NO; 

    if ([self cameraCount] > 1) { 
     NSError *error; 
     AVCaptureDeviceInput *newVideoInput; 
     AVCaptureDevicePosition position = [[videoInput device] position]; 

     BOOL mirror; 
     if (position == AVCaptureDevicePositionBack){ 
      newVideoInput = [[AVCaptureDeviceInput alloc] initWithDevice:[self frontFacingCamera] error:&error]; 
      switch ([self mirroringMode]) { 
       case AVCamMirroringOff: 
        mirror = NO; 
        break; 
       case AVCamMirroringOn: 
        mirror = YES; 
        break; 
       case AVCamMirroringAuto: 
       default: 
        mirror = YES; 
        break; 
      } 
     } 
     else if (position == AVCaptureDevicePositionFront){ 
      newVideoInput = [[AVCaptureDeviceInput alloc] initWithDevice:[self backFacingCamera] error:&error]; 
      switch ([self mirroringMode]) { 
       case AVCamMirroringOff: 
        mirror = NO; 
        break; 
       case AVCamMirroringOn: 
        mirror = YES; 
        break; 
       case AVCamMirroringAuto: 
       default: 
        mirror = NO; 
        break; 
      } 
     } 
     else 
      goto bail; 

     if (newVideoInput != nil) { 
      [[self session] beginConfiguration]; 
      [[self session] removeInput:[self videoInput]]; 
      if ([[self session] canAddInput:newVideoInput]) { 
       [[self session] addInput:newVideoInput]; 
       AVCaptureConnection *connection = [AVCamUtilities connectionWithMediaType:AVMediaTypeVideo fromConnections:[[self stillImageOutput] connections]]; 
       if ([connection isVideoMirroringSupported]) { 
        [connection setVideoMirrored:mirror]; 
       } 
       [self setVideoInput:newVideoInput]; 
      } else { 
       [[self session] addInput:[self videoInput]]; 
      } 
      [[self session] commitConfiguration]; 
      success = YES; 
      [newVideoInput release]; 

     } else if (error) { 
      if ([[self delegate] respondsToSelector:@selector(captureManager:didFailWithError:)]) { 
       [[self delegate] captureManager:self didFailWithError:error]; 
      } 
     } 
    } 

bail: 
    return success; 
} 
+0

नहीं, कोई त्रुटि लॉग नहीं है। आपकी क्या सलाह है? मैंने एवीकैम में देखा है (हाँ, मैंने 1.2 का उपयोग किया) और इसे लागू किया - कैप्चर मैनेजर: didFailWithError :, लेकिन अभी भी कोई त्रुटि लॉग नहीं है। ऐप कैमरे के चारों ओर केंद्रित नहीं है। कैमरा एक साइड चीज है और शायद कुछ भी इसका इस्तेमाल नहीं किया जा सकता है। मैंने एवीकैम को दोबारा जांच लिया है। केवल अंतर यह है कि, AVCam में कैमरा हमेशा मौजूद होता है, मैं ऊपर बताए गए कारणों से इसे खारिज करना चाहता हूं। – Reggian

+0

मेरी अद्यतन टिप्पणी देखें –

+0

बात यह है कि, आपकी परियोजना और एवीकैम प्रोजेक्ट में किए गए परिवर्तनों को देखे बिना, यह मुश्किल है। साथ ही, विश्लेषक चलाएं और देखें कि यह कुछ भी पकड़ता है या नहीं। –

9

इस-यह प्रयास करें मेरे लिए एक विजेता की तरह काम किया:

BOOL isUsingFrontFacingCamera; 

- (BOOL) swapCameras 
{ 
    if ([self cameraCount] > 1) { 
     AVCaptureDevicePosition desiredPosition; 
     if (isUsingFrontFacingCamera) { 
      desiredPosition = AVCaptureDevicePositionBack; 
     } else { 
      desiredPosition = AVCaptureDevicePositionFront; 
     } 

     for (AVCaptureDevice *d in [AVCaptureDevice devicesWithMediaType: AVMediaTypeVideo]) { 
      if ([d position] == desiredPosition) { 
       [[self session] beginConfiguration]; 
       AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:d error:nil]; 
       for (AVCaptureInput *oldInput in [[self session] inputs]) { 
        [[self session] removeInput:oldInput]; 
       } 
       [[self session] addInput:input]; 
       [[self session] commitConfiguration]; 
       break; 
      } 
     } 
     isUsingFrontFacingCamera = !isUsingFrontFacingCamera; 
     return YES; 
    } 
    return NO; 
} 

आप में मूल swapCameras को बदलने के लिए इस कोड को ड्रॉप करने में सक्षम होना चाहिए AVCamMirringMode एक struct इस प्रकार है VideoRecorderCaptureManager.m

उत्पत्ति: ऐप्पल का स्क्वायरकैम नमूना कोड।

+1

धन्यवाद। उत्कृष्ट – Dejell

+0

यह पूरी तरह से काम करता है। – user3117509

+0

यह कोड का एकमात्र टुकड़ा है जो मेरे लिए काम करता है। मुझे लगता है कि चाल सत्र से सभी इनपुट उपकरणों को हटाना है। धन्यवाद। – CarmenA

संबंधित मुद्दे