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

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

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

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

保存

保存(save)とは、特定のファイルを、ハードディスク等の外部記憶装置に記録する行為を指します。

Android Studio

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

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Q&A

0回答

1953閲覧

Camera2でVideoファイルをFirebaseに保存したい

Takuya615

総合スコア9

Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

保存

保存(save)とは、特定のファイルを、ハードディスク等の外部記憶装置に記録する行為を指します。

Android Studio

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

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

0グッド

0クリップ

投稿2020/09/07 02:58

編集2020/09/08 00:07

前提・実現したいこと

kotlinのCamera2 APIでVideo機能を実装しようとしています。
撮影した動画ファイルを、FirebaseStorageに保存します。

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

エラーもなく、Firebaseコンソール上にもファイルが保存されたのですが、
ファイルの中身を再生してみると、0:00秒の真っ黒な動画しか保存されていません。サイズも最大で6.19KBしかなく、映像の中身だけがないような状態になっています。

該当のソースコード

録画時のボタンアクション。

//ボタンを押したときのアクション  録画スタートとストップ private fun startRecording() { // Record to the external cache directory for visibility val file = File(externalMediaDirs.first(), "${System.currentTimeMillis()}.mp4") recorder = MediaRecorder().apply { setAudioSource(MediaRecorder.AudioSource.MIC) setVideoSource(MediaRecorder.VideoSource.SURFACE); setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP) setOutputFile(file.toString()) setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB) setVideoEncoder(MediaRecorder.VideoEncoder.VP8); try { prepare() start() } catch (e: java.lang.Exception) { } //FirebaseStorageへ アップロード val storageRef = storage.reference val photoRef = storageRef.child("images/${System.currentTimeMillis()}.mp4") val movieUri = Uri.fromFile(file) val uploadTask = photoRef.putFile(movieUri) // Register observers to listen for when the download is done or if it fails uploadTask.addOnFailureListener { Log.e("TAG","ストレージへ保存失敗") }.addOnSuccessListener { Log.e("TAG","ストレージへ保存成功") Log.e("TAG",photoRef.toString()) } } } private fun stopRecording() { recorder?.apply { stop() release() } recorder = null }

openCamera() のコード

fun openCamera(width: Int, height: Int) { val manager: CameraManager = getSystemService(Context.CAMERA_SERVICE) as CameraManager //CameraIdListのゼロ番目は多くの場合、背面カメラの1倍 val permission = ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) val permission2 = ContextCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO) if (permission != PackageManager.PERMISSION_GRANTED) { requestCameraPermission() return } if (permission2 != PackageManager.PERMISSION_GRANTED) { requestRECORD_AUDIOPermission() return } setUpCameraOptions() configureTransform(width, height) //ここにオプションやコンフィグトランスフォームの設定関数入れる? manager.openCamera(cameraId, stateCallback, backgroundHandler); }

openCamera()で使う設定

//           ↑  上のopenCameraの第2引数として利用  ↑ private val stateCallback = object : CameraDevice.StateCallback() { override fun onOpened(cameraDevice: CameraDevice) { this@Camera2Activity.cameraDevice = cameraDevice createCameraPreviewSession() } override fun onDisconnected(cameraDevice: CameraDevice) { cameraDevice.close() this@Camera2Activity.cameraDevice = null } override fun onError(cameraDevice: CameraDevice, error: Int) { onDisconnected(cameraDevice) finish() } } // ↑  上のstateCallback関数のonOpendで使われるl関数   ↑ private fun createCameraPreviewSession() { val texture = textureView.surfaceTexture texture.setDefaultBufferSize(previewSize.width, previewSize.height) val surface = Surface(texture)//TextureViewからの撮影データの受取先 previewRequestBuilder = cameraDevice!!.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW) previewRequestBuilder.addTarget(surface) // CameraCaptureSession はカメラから送られてくる画像を受け取ったり、 // 同一セッションで前に受け取った画像の再処理などをするクラスです cameraDevice?.createCaptureSession(Arrays.asList(surface, imageReader?.surface), @RequiresApi(Build.VERSION_CODES.LOLLIPOP) object : CameraCaptureSession.StateCallback() { override fun onConfigured(cameraCaptureSession: CameraCaptureSession) { if (cameraDevice == null) return; captureSession = cameraCaptureSession previewRequestBuilder.set( CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE ) //プレビュー画像を TextureView に送ります previewRequest = previewRequestBuilder.build() captureSession?.setRepeatingRequest( previewRequest, null, null ) } override fun onConfigureFailed(session: CameraCaptureSession) {} }, null ) }

試したこと

setAudioSourceや setVideoSource、エンコーダーの種類など、いろんな種類で切り替えてみましたが、うまくいきませんでした。
エミュレーターをPixel3a API30に変更してみました。
ネットから他のCamera2の実装方法も調べてみましたが、エラーメッセージもないため、どこが問題なのかもよくわかりませんでした。

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

Android Studio 4.0.1

初めての質問です。もし要領を得ない部分がありましたら、申し訳ありません。
お力添えいただければ幸いです。
よろしくお願い致します。

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問