7

我遇到的問題是,當用戶使用我們的應用程序拍攝照片時,使用AVCaptureSession,我無法確定無論他們是以人像還是風景模式拍攝照片。我們的應用程序僅支持肖像,並且在使用手機時保持方向鎖定不變,因此我正在嘗試構建一種假設其他人可能也這樣做的解決方案。當方向鎖定打開且應用程序僅支持縱向時,如何檢測設備方向

我看着使用[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]但方向鎖打開時,沒有收到任何通知。我知道這一功能是可能的,因爲當我的手機有方向鎖定功能時,Google相冊應用和Google環聊應用中的相機可以檢測到旋轉(取消和閃光按鈕顯示的動畫)。

是我最好的選擇使用加速度計和檢測手機旋轉的角度?一箇舊的答案,Detect iPhone screen orientation,這很明顯,檢測這種方式很容易做到這一點(顯然適應使用Core Motion而不是UIAccelerometer),但我很好奇,如果有另一種方式來做到這一點。

回答

1

是的,你可以通過查看圖像的元數據來做到這一點。沒有時間寫出詳細的答案(對此感到抱歉),但是我通過CMCopyDictionaryOfAttachments(NULL, buffer, kCMAttachmentMode_ShouldPropagate);返回了我自己的項目,在那裏我通過了緩衝區的CMSampleBufferRef。我得到了緩衝來自

captureStillImageAsynchronouslyFromConnection:stillImageConnection completionHandler: ^(CMSampleBufferRef imageDataSampleBuffer, NSError *error){}

,但你可以從

- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection得到它。

您可以找到該字典的所有密鑰here

對方向鎖定進行了默認相機應用程序的快速測試,並且我確實獲得了兩張圖片的不同方向。肖像畫一個6,風景畫一個3。

再一次,想給你更多關於這方面的細節,但我相信你可以通過查看文檔來弄明白。

+1

感謝您使用CMCopyDictionaryOfAttachments,它使讀取元數據變得非常容易。使用'captureStillImageAsynchronouslyFromConnection'我仍然只能取得方向= 6.我啓用了應用程序的橫向模式,但無濟於事。我將在品牌中試用新應用程序,以確保沒有隱藏導致此問題的某處的奇怪設置。 – TheJer

+1

假設你有'AVCaptureConnection *連接',你是否在任何地方設置connection.videoOrientation?無論我嘗試什麼,元數據都會返回6,因爲videoOrientation默認爲'AVCaptureVideoOrientationPortrait'。這導致我一直回到如何檢測旋轉以更改捕獲方向的原始問題。 – TheJer

+0

是的,我想我記得還有一些問題。不幸的是,現在沒有時間深入研究它。但它應該是可能的,因爲默認的相機應用程序會這樣做,並且我認爲他們沒有經歷過使用自己的私有API的麻煩。 – vegather

相關問題