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

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

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

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

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

Kotlin

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

Q&A

2回答

383閲覧

SMBで取得したNAS内にある動画を再生する方法について

Flash

総合スコア0

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

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

Kotlin

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

0グッド

0クリップ

投稿2023/10/23 07:40

編集2023/10/23 07:43

実現したいこと

ボタンを押すとNAS内のフォルダを取得し動画ファイルを選択すると再生するようにしたいです。

前提

openFile()ではファイルサイズが取得できているので接続自体は大丈夫だと思うのですが、
playVideo()で再生しようと思うと「この動画は再生できません」と出て再生できません。
何か解決策等わかる方いらっしゃいましたらお願いします。

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

2023-10-23 14:34:18.491 21194-21224 MediaPlayerNative com.example.fileview E error (1, -2147483648) 2023-10-23 14:34:18.498 21194-21194 MediaPlayer com.example.fileview E Error (1,-2147483648) 再生しようとすると「この動画は再生できません」と出ます。

該当のソースコード

kotlin

1import省略 2 3class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelectedListener{ 4 var TAG = "MainActivity" 5 6 private val folderHistory = Stack<String>() 7 var title: String = "" 8 var filePath: String = "" 9 10 private val videoView: VideoView by lazy { findViewById(R.id.videoView) } 11 12 private lateinit var folderListView: ListView 13 14 private val mf_job: Job = SupervisorJob() 15 private val mf_scope = CoroutineScope(Dispatchers.Default + this.mf_job) 16 17 private val nasHostIP = "HostIP" 18 private val nasShare = "PATH" 19 val domain = "" 20 private val smbURL = "smb://$nasHostIP/$nasShare" 21 22 object NetworkConfig { 23 private val username = "username" 24 private val password = "password" 25 26 val prop: Properties = Properties() 27 val auth: NtlmPasswordAuthenticator = NtlmPasswordAuthenticator(username, password) 28 val bc: BaseContext = BaseContext(PropertyConfiguration(prop)) 29 val cifsCon: CIFSContext = bc.withCredentials(auth) 30 } 31 32 // 初期設定 33 private fun initSetting() { 34 val button = findViewById<Button>(R.id.button) 35 folderListView = findViewById<ListView>(R.id.folderListView) 36 //val fileListView = findViewById<ListView>(R.id.fileListView) 37 38 // アダプターを初期化 39 val folderAdapter = ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, mutableListOf()) 40 folderListView.adapter = folderAdapter 41 val fileAdapter = ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, mutableListOf()) 42 43 folderListView.setOnItemClickListener { parent, view, position, id -> 44 val clickedFolder = folderListView.adapter.getItem(position).toString() 45 46 mf_scope.launch(Dispatchers.IO) { 47 filePath = "$smbURL$title" + "/" + clickedFolder 48 if (clickedFolder != null) { 49 if (isVideoFile(clickedFolder)){ 50 //openFile(clickedFolder) 51 // 動画を再生 52 val videoPath = "$smbURL$title/$clickedFolder" 53 Log.d("再生PATH",videoPath) 54 playVideo(videoPath) 55 }else{ 56 title = clickedFolder 57 val folderNameWithSlash = "$clickedFolder/" 58 // フォルダ内のファイルとフォルダの一覧を更新 59 updateFolderAndFileList(folderNameWithSlash) 60 Log.d(TAG, folderNameWithSlash) 61 } 62 }else{ 63 //openFile(clickedFolder) 64 // 動画を再生 65 val videoPath = "$smbURL$title/$clickedFolder" 66 Log.i("クリックされたファイルパス",videoPath) 67 Log.i("クリックされたファイルパス",filePath) 68 playVideo(videoPath) 69 } 70 } 71 } 72 button.setOnClickListener { 73 // 非同期処理 74 mf_scope.launch { 75 runOnUiThread { 76 updateFolderAndFileList("") 77 } 78 } 79 } 80 } 81 82 private fun updateFolderAndFileList(folderName: String) { 83 mf_scope.launch(Dispatchers.IO) { 84 val folderAndFileNames = getFolderAndFileNames(folderName) 85 86 runOnUiThread { 87 folderHistory.push(folderName) 88 val folderAndFileAdapter = ArrayAdapter<String>(this@MainActivity, android.R.layout.simple_list_item_1, folderAndFileNames) 89 folderListView.adapter = folderAndFileAdapter 90 } 91 } 92 } 93 94 private suspend fun getFolderAndFileNames(folderName: String): List<String> = withContext(Dispatchers.IO) { 95 try { 96 val smbFolder = SmbFile("$smbURL/$folderName", NetworkConfig.cifsCon) 97 val items = smbFolder.listFiles() 98 99 val folderAndFileNames = mutableListOf<String>() 100 101 for (item in items) { 102 val itemName = item.name.removeSuffix("/") 103 folderAndFileNames.add(itemName) 104 } 105 return@withContext folderAndFileNames 106 } catch (e: Exception) { 107 e.printStackTrace() 108 return@withContext emptyList() 109 } 110 } 111 112 private fun openFile(fileName: String) { 113 // ファイルを開くための処理を実装 114 mf_scope.launch(Dispatchers.Main) { 115 // ファイルサイズを取得 116 val fileSize = getFileSize(title + "/" + fileName) 117 Log.d(TAG,fileSize) 118 val dialog = AlertDialog.Builder(this@MainActivity) 119 .setTitle("$title") 120 .setMessage("パス:$filePath\n" + "ファイル名:$fileName\n" + "ファイルサイズ:$fileSize\n") 121 .setPositiveButton("閉じる") { dialog, _ -> 122 dialog.dismiss() 123 } 124 .create() 125 dialog.show() 126 } 127 } 128 129 private suspend fun getFileSize(fileName: String): String = withContext(Dispatchers.IO) { 130 try { 131 val smbFile = SmbFile("$smbURL/$fileName", NetworkConfig.cifsCon) 132 val fileSize = smbFile.length() 133 134 return@withContext formatFileSize(fileSize) 135 } catch (e: Exception) { 136 e.printStackTrace() 137 return@withContext "ファイルサイズの取得に失敗しました" 138 } 139 } 140 141 fun formatFileSize(bytes: Long): String { 142 val kiloBytes = bytes / 1024 143 val megaBytes = kiloBytes / 1024 144 val gigaBytes = megaBytes / 1024 145 146 return when { 147 gigaBytes > 1 -> "$gigaBytes GB" 148 megaBytes > 1 -> "$megaBytes MB" 149 kiloBytes > 1 -> "$kiloBytes KB" 150 else -> "$bytes B" 151 } 152 } 153 154 private fun isVideoFile(filename: String): Boolean { 155 val videoFileExtensions = listOf("mp4", "avi", "mkv", "mov", "wmv") 156 val fileExtension = filename.substringAfterLast(".") 157 return videoFileExtensions.contains(fileExtension) 158 } 159 160 override fun onCreate(savedInstanceState: Bundle?) { 161 super.onCreate(savedInstanceState) 162 setContentView(R.layout.activity_main) 163 164 this.initSetting() 165 } 166 167 private fun playVideo(videoPath: String) { 168 169 Log.d("再生される動画Path:",videoPath) 170 val videoView = findViewById<VideoView>(R.id.videoView) 171 val mediaPlayer = MediaPlayer() 172 173 runOnUiThread { 174 videoView.setVideoPath(videoPath) 175 videoView.visibility = View.VISIBLE // ビデオビューを表示 176 videoView.setOnCompletionListener { mediaPlayer -> 177 mediaPlayer.stop() 178 mediaPlayer.release() 179 runOnUiThread { 180 videoView.visibility = View.GONE // ビデオビューを非表示 181 } 182 } 183 videoView.start() 184 } 185 } 186}

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

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

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

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

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

guest

回答2

0

import が省略されているためクラスが何なのか確実なところが分かりませんが、 android.widget.VideoView でしたら、内部で MediaPlayer を用意し setDataSource で URI を設定して再生していると思います。(ログにも MediaPlayer と出ているようですが。)
従って MediaPlayer が扱える URI である必要があります。

MediaPlayer の概要
https://developer.android.com/guide/topics/media/mediaplayer?hl=ja

サポートされているメディア形式
https://developer.android.com/guide/topics/media/media-formats?hl=ja

ネットワークプロトコル
https://developer.android.com/guide/topics/media/media-formats?hl=ja#network

オーディオと動画の再生では、以下のネットワーク プロトコルがサポートされています。
RTSP(RTP、SDP)
HTTP / HTTPS プログレッシブ ストリーミング
HTTP / HTTPS ライブ ストリーミング

Samba は入っていませんので、その段階でダメになっているのではないでしょうか。

投稿2023/10/23 10:37

編集2023/10/23 10:45
jimbe

総合スコア12951

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

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

0

状況がわかりませんが、WEBからwindowsファイルシステムでファイルを取得して実行したいということですか?
それはブラウザの仕組み上厳しいので、専用のアプリを作るなどで対応してみてください

投稿2023/10/23 08:17

yambejp

総合スコア115568

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.41%

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

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

質問する

関連した質問