質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Objective-C

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xamarin

Xamarin(ザマリン)は、iPhoneなどのiOSやAndroidで動作し、C# 言語を用いてアプリを開発できるクロスプラットフォーム開発環境です。Xamarin Studioと C# 言語を用いて、 iOS と Android の両方の開発を行うことができます。

Q&A

解決済

1回答

1857閲覧

Objective-Cで書かれた関数内の一部処理がXamarin(C#)に移植できない

RNG

総合スコア13

Objective-C

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xamarin

Xamarin(ザマリン)は、iPhoneなどのiOSやAndroidで動作し、C# 言語を用いてアプリを開発できるクロスプラットフォーム開発環境です。Xamarin Studioと C# 言語を用いて、 iOS と Android の両方の開発を行うことができます。

0グッド

0クリップ

投稿2016/07/28 15:02

###前提・実現したいこと
Objective-Cで書かれた以下の関数をXamarin(C#)へ移植したいですが、移植ができず詰まっている部分があります。
問題部分の移植方法並びに、怪しい移植をしている部分をご教示いただけますと幸いです。

Objective

1// captureSessionはクラスのprivate変数です。 2 3- (void)switchFormatWithDesiredFPS:(CGFloat)desiredFPS 4{ 5 BOOL isRunning = self.captureSession.isRunning; 6 7 if (isRunning) [self.captureSession stopRunning]; 8 9 AVCaptureDevice *videoDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; 10 AVCaptureDeviceFormat *selectedFormat = nil; 11 int32_t maxWidth = 0; 12 AVFrameRateRange *frameRateRange = nil; 13 14 for (AVCaptureDeviceFormat *format in [videoDevice formats]) { 15 16 for (AVFrameRateRange *range in format.videoSupportedFrameRateRanges) { 17 18 CMFormatDescriptionRef desc = format.formatDescription; 19 CMVideoDimensions dimensions = CMVideoFormatDescriptionGetDimensions(desc); 20 int32_t width = dimensions.width; 21 22 if (range.minFrameRate <= desiredFPS && desiredFPS <= range.maxFrameRate && width >= maxWidth) { 23 24 selectedFormat = format; 25 frameRateRange = range; 26 maxWidth = width; 27 } 28 } 29 } 30 31 if (selectedFormat) { 32 33 if ([videoDevice lockForConfiguration:nil]) { 34 35 NSLog(@"selected format:%@", selectedFormat); 36 videoDevice.activeFormat = selectedFormat; 37 videoDevice.activeVideoMinFrameDuration = CMTimeMake(1, (int32_t)desiredFPS); 38 videoDevice.activeVideoMaxFrameDuration = CMTimeMake(1, (int32_t)desiredFPS); 39 [videoDevice unlockForConfiguration]; 40 } 41 } 42 43 if (isRunning) [self.captureSession startRunning]; 44}

###発生している問題・エラーメッセージ
以下のソース中の『//★』を付けた箇所でコンパイルエラーが起きます(左辺と右辺で型が異なるため)。
また、『//☆』を付けた行は、移植がこれで正しいのか判断しかねています。

C#

1// captureSessionはクラスのprivate変数です。 2 3 public void switchFormatWithDesiredFPS(nfloat desireFPS) 4 { 5 bool isRunning = this.captureSession.Running; 6 if (isRunning) 7 { 8 this.captureSession.StopRunning(); 9 } 10 11 AVCaptureDevice videoDevice = AVCaptureDevice.DefaultDeviceWithMediaType(AVMediaType.Video); 12 AVCaptureDeviceFormat selectedFormat = null; 13 int maxWidth = 0; 14 AVFrameRateRange frameRateRange = null; 15 16 foreach (AVCaptureDeviceFormat format in videoDevice.Formats) 17 { 18 foreach (AVFrameRateRange range in format.VideoSupportedFrameRateRanges) 19 { 20 CMFormatDescription desc = format.FormatDescription; //☆ 21 CMVideoDimensions dimensions = CMVideoFormatDescription.Create(desc.Handle); //★ この行でエラー 22 int width = dimensions.Width; 23 24 if ((range.MinFrameRate <= desireFPS) && 25 (desireFPS <= range.MaxFrameRate) && (width >= maxWidth)) 26 { 27 selectedFormat = format; 28 frameRateRange = range; 29 maxWidth = width; 30 } 31 } 32 } 33 34 if (selectedFormat != null) 35 { 36 NSError error = new NSError(); 37 if (videoDevice.LockForConfiguration(out error)) 38 { 39 Console.WriteLine("selected format:{0}", selectedFormat); 40 videoDevice.ActiveFormat = selectedFormat; 41 videoDevice.ActiveVideoMinFrameDuration = CMTime.FromSeconds(1, (int)desireFPS); //☆ 42 videoDevice.ActiveVideoMaxFrameDuration = CMTime.FromSeconds(1, (int)desireFPS); //☆ 43 videoDevice.UnlockForConfiguration(); 44 } 45 } 46 47 if (isRunning) 48 { 49 this.captureSession.StartRunning(); 50 } 51 }

###試したこと
Xamarinで『CMVideoFormatDescription.』まで入力した際に表示されるサジェストは一通り試しました。
また、右辺をCMVideoDimensions型でキャストすることはできませんでした。

###補足情報(言語/FW/ツール等のバージョンなど)
OS: Mac OSX El Capitan 10.11.6
開発環境: Xamarin Studio Community 6.0.1(build 9)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

RNG

2016/07/29 16:29

コメントいただきありがとうございます。読んでみました。 (リンク切れしてたため、以下のURLを見ました) https://developer.xamarin.com/api/type/CoreMedia.CMVideoFormatDescription/ CMVideoFormatDescription型のインスタンスを生成して それのプロパティ「Dimensions」を呼び出せば良さそうに見えました。 ですが、Objective-Cの該当部分の処理を見ても、 C#の場合ではどのようにCMVideoFormatDescription型のインスタンスを生成すれば 同じ処理に相当するかが分かりません。 インスタンス生成時に下記の2つの引数が必要ですが、それぞれ何を指定すれば良いでしょうか。  ・CMVideoCodecType型  ・CMVideoDimensions型
guest

回答1

0

ベストアンサー

XamarinもC#も知りませんが、CMFormatDescriptionにDimensionsというプロパティがあるようなので、

c#

1CMVideoDimensions dimensions = desc.Dimensions

これで取れないでしょうか?

投稿2016/07/28 23:52

fuzzball

総合スコア16731

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

RNG

2016/07/29 16:34

回答いただきありがとうございます。 descをCMVideoFormatDescription型にキャストしてDimensionsを呼び出してみました。 動作を確認してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問