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

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

新規登録して質問してみよう
ただいま回答率
85.46%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

0回答

2006閲覧

Android Studio:動画のフレームレートを60fpsにすることは可能ですか?

退会済みユーザー

退会済みユーザー

総合スコア0

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2021/12/01 07:06

前提・実現したいこと

Android Studioで60fpsの動画を撮影するカメラアプリを作成しています。
作成には古いCamera APIを利用しています。

・現在実装できていること
動画を撮影して、保存する。
30fpsで動画を撮影する。

・実装したいこと
60fpsで動画を撮影する。

発生している問題・エラーメッセージ

//カメラのフレームレートを決定
の部分でサポートされているカメラのフレームレートが表示されるのですが、30fpsまでしかサポートされていないようです。

古いCamera APIでは60fpsで動画を撮影することは不可能なのでしょうか?
また、Camera2 APIでは60fpsで動画を撮影することは可能なのでしょうか?

該当のソースコード

Java

1package com.websarva.wings.android.testcamera1; 2 3import static android.content.ContentValues.TAG; 4 5import androidx.appcompat.app.AppCompatActivity; 6 7import android.content.Context; 8import android.content.pm.PackageManager; 9import android.hardware.Camera; 10import android.media.CamcorderProfile; 11import android.media.MediaRecorder; 12import android.os.Bundle; 13import android.os.Environment; 14import android.util.Log; 15import android.view.SurfaceHolder; 16import android.view.SurfaceView; 17import android.view.View; 18import android.widget.Button; 19import android.widget.FrameLayout; 20 21import java.io.File; 22import java.io.IOException; 23import java.text.SimpleDateFormat; 24import java.util.Date; 25import java.util.List; 26 27public class MainActivity extends AppCompatActivity { 28 29 private Camera mCamera; 30 private CameraPreview mPreview; 31 private MediaRecorder mediaRecorder; 32 private boolean isRecording = false; 33 private File file; 34 public static final int MEDIA_TYPE_IMAGE = 1; 35 public static final int MEDIA_TYPE_VIDEO = 2; 36 37 @Override 38 protected void onCreate(Bundle savedInstanceState) { 39 super.onCreate(savedInstanceState); 40 setContentView(R.layout.activity_main); 41 42 // Cameraのインスタンスを作成します 43 mCamera = getCameraInstance(); 44 45 //ファイルを作成 46 Context context = getApplicationContext(); 47 String fileName = "mediaFile.mp4"; 48 file = new File(context.getFilesDir(), fileName); 49 50 // プレビュービューを作成し、アクティビティのコンテンツとして設定します。 51 mPreview = new CameraPreview(this, mCamera); 52 FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview); 53 preview.addView(mPreview); 54 55 56 // [キャプチャ]ボタンにリスナーを追加します 57 Button captureButton = (Button) findViewById(R.id.button_capture); 58 captureButton.setOnClickListener( 59 new View.OnClickListener() { 60 @Override 61 public void onClick(View v) { 62 if (prepareVideoRecorder()) { 63 // カメラが利用可能でロックが解除され、MediaRecorderが準備され、 64 // 録画を開始できるようになりました 65 mediaRecorder.start(); 66 67 isRecording = true; 68 } else { 69 // 準備がうまくいかなかった、カメラを解放します 70 releaseMediaRecorder(); 71 // ユーザーに通知する 72 } 73 } 74 } 75 ); 76 77 // [ストップ]ボタンにリスナーを追加します 78 Button captureStop = (Button) findViewById(R.id.button_stop); 79 captureStop.setOnClickListener( 80 new View.OnClickListener() { 81 @Override 82 public void onClick(View v) { 83 // 録画を停止してカメラを解放します 84 mediaRecorder.stop(); // 録画を停止します 85 releaseMediaRecorder(); // MediaRecorderオブジェクトを解放します 86 mCamera.lock(); // MediaRecorderからカメラアクセスを取り戻す 87 88 isRecording = false; 89 } 90 } 91 ); 92 } 93 94 //カメラハードウェアの検出 95 private boolean checkCameraHardware(Context context) { 96 if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)){ 97 // カメラ有り 98 return true; 99 } else { 100 // カメラ無し 101 return false; 102 } 103 } 104 105 //Cameraインスタンスを取得 106 public static Camera getCameraInstance(){ 107 Camera c = null; 108 try { 109 c = Camera.open(); // インスタンス取得 110 } 111 catch (Exception e){ 112 // カメラが利用できない 113 } 114 return c; // カメラが利用できない場合はnullを返す 115 } 116 117 // 基本的なカメラプレビュークラス 118 public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback { 119 private SurfaceHolder mHolder; 120 private Camera mCamera; 121 122 public CameraPreview(Context context, Camera camera) { 123 super(context); 124 mCamera = camera; 125 126 //カメラプレビューのフレームレートを決定 127 Camera.Parameters parameters = mCamera.getParameters(); 128 List<Integer> supportedPreviewFrameRates = parameters.getSupportedPreviewFrameRates(); 129 for (int i = 0; i < supportedPreviewFrameRates.size(); i++) { 130 Log.d(TAG, "SupportedPreviewFrameRates: "+ i + " / rate: " + supportedPreviewFrameRates.get(i)); 131 } 132 parameters.setPreviewFrameRate(supportedPreviewFrameRates.get(5)); 133 mCamera.setParameters(parameters); 134 135 // SurfaceHolder.Callbackをインストールして、 136 // 基になるサーフェスが作成および破棄されたときに通知を受け取るようにします。 137 mHolder = getHolder(); 138 mHolder.addCallback(this); 139 //非推奨の設定ですが、3.0より前のAndroidバージョンでは必要です 140 mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 141 } 142 143 public void surfaceCreated(SurfaceHolder holder) { 144 //Surfaceが作成されました。次に、プレビューを描画する場所をカメラに指示します。 145 try { 146 mCamera.setPreviewDisplay(holder); 147 mCamera.startPreview(); 148 } catch (IOException e) { 149 Log.d(TAG, "Error setting camera preview: " + e.getMessage()); 150 } 151 } 152 153 public void surfaceDestroyed(SurfaceHolder holder) { 154 // 空の。 アクティビティでカメラプレビューをリリースするように注意してください。 155 } 156 157 public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { 158 // プレビューが変更または回転する可能性がある場合は、ここでそれらのイベントに注意してください。 159 // サイズを変更したり再フォーマットしたりする前に、必ずプレビューを停止してください。 160 161 if (mHolder.getSurface() == null){ 162 // プレビューサーフェスが存在しません 163 return; 164 } 165 166 // 変更を加える前にプレビューを停止する 167 try { 168 mCamera.stopPreview(); 169 } catch (Exception e){ 170 // 無視:存在しないプレビューを停止しようとしました 171 } 172 173 // ここでプレビューサイズを設定し、サイズ変更、回転、または再フォーマットの変更を行います 174 // 新しい設定でプレビューを開始 175 try { 176 mCamera.setPreviewDisplay(mHolder); 177 mCamera.startPreview(); 178 179 } catch (Exception e){ 180 Log.d(TAG, "Error starting camera preview: " + e.getMessage()); 181 } 182 } 183 } 184 185 // MediaRecorder の設定 186 private boolean prepareVideoRecorder(){ 187 188 mCamera = getCameraInstance(); 189 mediaRecorder = new MediaRecorder(); 190 191 // Step 1: カメラのロックを解除してMediaRecorderに設定します 192 mCamera.unlock(); 193 mediaRecorder.setCamera(mCamera); 194 195 // Step 2: ソースを設定する 196 mediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER); 197 mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); 198 199 // Step 3: CamcorderProfileを設定します(APIレベル8以上が必要です) 200 mediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH)); 201 202 // Step 4: 出力ファイルを設定します 203 mediaRecorder.setOutputFile(getOutputMediaFile(MEDIA_TYPE_VIDEO).toString()); 204 205 // Step 5: プレビュー出力を設定します 206 mediaRecorder.setPreviewDisplay(mPreview.getHolder().getSurface()); 207 208 // Step 6: 構成済みのMediaRecorderを準備します 209 try { 210 mediaRecorder.prepare(); 211 } catch (IllegalStateException e) { 212 Log.d(TAG, "IllegalStateException preparing MediaRecorder: " + e.getMessage()); 213 releaseMediaRecorder(); 214 return false; 215 } catch (IOException e) { 216 Log.d(TAG, "IOException preparing MediaRecorder: " + e.getMessage()); 217 releaseMediaRecorder(); 218 return false; 219 } 220 return true; 221 } 222 223 @Override 224 protected void onPause() { 225 super.onPause(); 226 releaseMediaRecorder(); // MediaRecorderを使用している場合は、最初に解放してください 227 releaseCamera(); // 一時停止イベントが発生したらすぐにカメラを解放します 228 } 229 230 private void releaseMediaRecorder(){ 231 if (mediaRecorder != null) { 232 mediaRecorder.reset(); // 明確なレコーダー構成 233 mediaRecorder.release(); // レコーダオブジェクトを解放します 234 mediaRecorder = null; 235 mCamera.lock(); // 後で使用するためにカメラをロックする 236 } 237 } 238 239 private void releaseCamera(){ 240 if (mCamera != null){ 241 mCamera.release(); // 他のアプリケーションのためにカメラを解放します 242 mCamera = null; 243 } 244 } 245 246 //画像またはビデオを保存するためのファイルを作成する 247 private File getOutputMediaFile(int type){ 248 return file; 249 } 250} 251 252 253

補足情報(FW/ツールのバージョンなど)

開発環境:Android Studio Arctic Fox | 2020.3.1 Patch 2
開発言語:Java
使用端末:OPPO Reno5 A
Androidバージョン:11
使用端末は既存のカメラアプリなら60fpsで動画撮影可能です。
カメラアプリ作成について調べたのですがフレームレートに関する情報が少なかったため、こちらで質問させていただきます。

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

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

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

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

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

jimbe

2021/12/01 07:43

> Camera2 APIでは60fpsで動画を撮影することは可能なのでしょうか? やってみては如何でしょうか?
Wind

2021/12/01 07:45

> Log.d(TAG, "SupportedPreviewFrameRates: "+ i + " / rate: " + supportedPreviewFrameRates.get(i)); ここで30fpsまでしか出ないのでしたら、スマホ側が情報を渡していないのでは無いのでしょうか? 他のスマホで試してみたらどうでしょう?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問