質問編集履歴

5

入力ミス修正

2021/08/20 00:16

投稿

beam1111
beam1111

スコア1

test CHANGED
File without changes
test CHANGED
@@ -122,7 +122,7 @@
122
122
 
123
123
  'obj' => null,
124
124
 
125
- 'content' => null,
125
+ 'content' => <video id="mp4_video"></video>,
126
126
 
127
127
  },
128
128
 

4

playmp4, pausemp4の入力ミス修正

2021/08/20 00:16

投稿

beam1111
beam1111

スコア1

test CHANGED
File without changes
test CHANGED
@@ -290,6 +290,8 @@
290
290
 
291
291
  if (val.type == 'mp4') {
292
292
 
293
+ $("#mp4_play_block").html(mp4[i].content);
294
+
293
295
  mp4[i].obj = document.getElementById('mp4_video');
294
296
 
295
297
  mp4[i].content = $("#mp4_video");

3

playmp4, pausemp4の入力ミス修正

2021/08/20 00:13

投稿

beam1111
beam1111

スコア1

test CHANGED
File without changes
test CHANGED
@@ -136,6 +136,8 @@
136
136
 
137
137
  function playMp4(i) {
138
138
 
139
+ $("#mp4_play_block").html(mp4[i].content);
140
+
139
141
  mp4[i].obj.currentTime = 0;
140
142
 
141
143
  mp4[i].obj.play();
@@ -148,6 +150,8 @@
148
150
 
149
151
  function pauseMp4(i) {
150
152
 
153
+ $("#mp4_play_block").html(mp4[i].content);
154
+
151
155
  mp4[i].obj.pause();
152
156
 
153
157
  mp4[i].obj.currentTime = 0;

2

入力ミスの修正

2021/08/20 00:12

投稿

beam1111
beam1111

スコア1

test CHANGED
File without changes
test CHANGED
@@ -84,7 +84,7 @@
84
84
 
85
85
  <?php foreach ($materials as $material): ?>
86
86
 
87
- <div class="<?= h($material['class']); ?>" style="display: none;">
87
+ <div class="box type_mp4" id="mp4_play_block" style="display: none;">
88
88
 
89
89
  <video id="mp4_video"></video>
90
90
 

1

動画を再生しているページのコード、Androidアプリの動画再生ページのコードの追加

2021/08/19 09:36

投稿

beam1111
beam1111

スコア1

test CHANGED
File without changes
test CHANGED
@@ -69,3 +69,443 @@
69
69
 
70
70
 
71
71
  SMART TV BOX(実機): AP6330
72
+
73
+
74
+
75
+ コードを追記いたしました。ご指摘ありがとうございます。
76
+
77
+
78
+
79
+ ### コード
80
+
81
+ ```php
82
+
83
+ // 動画のwrapper部分
84
+
85
+ <?php foreach ($materials as $material): ?>
86
+
87
+ <div class="<?= h($material['class']); ?>" style="display: none;">
88
+
89
+ <video id="mp4_video"></video>
90
+
91
+ </div>
92
+
93
+ <?php endforeach; ?>
94
+
95
+ ```
96
+
97
+
98
+
99
+ ```javascript
100
+
101
+ var mp4;
102
+
103
+
104
+
105
+ <?php if (!empty($material_mp4)): ?>
106
+
107
+ mp4 = <?= json_encode(($material_mp4)); ?>;
108
+
109
+ <?php endif; ?>
110
+
111
+ /*
112
+
113
+ $material_mp4 = [
114
+
115
+ {
116
+
117
+ 'type' => 'mp4',
118
+
119
+ 'no' => 動画の再生順番号,
120
+
121
+ 'source' => m3u8マスターファイル格納場所,
122
+
123
+ 'obj' => null,
124
+
125
+ 'content' => null,
126
+
127
+ },
128
+
129
+ ...
130
+
131
+ ];
132
+
133
+ */
134
+
135
+
136
+
137
+ function playMp4(i) {
138
+
139
+ mp4[i].obj.currentTime = 0;
140
+
141
+ mp4[i].obj.play();
142
+
143
+ }
144
+
145
+
146
+
147
+
148
+
149
+ function pauseMp4(i) {
150
+
151
+ mp4[i].obj.pause();
152
+
153
+ mp4[i].obj.currentTime = 0;
154
+
155
+ }
156
+
157
+
158
+
159
+
160
+
161
+ var scene_manager = function () {
162
+
163
+ var items = <?= json_encode($items); ?>;
164
+
165
+ /*
166
+
167
+ items = [
168
+
169
+ { time: 指定した動画再生時間, action: 'play_video_' + 動画の再生順番号 },
170
+
171
+ ...
172
+
173
+ ]
174
+
175
+ */
176
+
177
+ var START_INDEX = 1;
178
+
179
+ var END_INDEX = <?= $item_count; ?>;
180
+
181
+ var index = START_INDEX;
182
+
183
+ var prev = START_INDEX;
184
+
185
+
186
+
187
+ var show = function () {
188
+
189
+ var now = index;
190
+
191
+ // 動画の切り替えをする
192
+
193
+ $('.type_' + scene_box_list[prev]).fadeOut(0, function () {
194
+
195
+ $('.type_' + scene_box_list[now]).fadeIn(0);
196
+
197
+ });
198
+
199
+
200
+
201
+ var flg = 0;
202
+
203
+
204
+
205
+ // 次の動画を再生する
206
+
207
+ $.each(mp4, function(i, val) {
208
+
209
+ if (items[index].action == 'play_mp4_' + val.no) {
210
+
211
+ playMp4(i);
212
+
213
+ return false;
214
+
215
+ }
216
+
217
+ });
218
+
219
+
220
+
221
+ // 動画の切り替えを予約しておく
222
+
223
+ if (flg == 0) {
224
+
225
+ setTimeout(function(){
226
+
227
+ pauseVideos();
228
+
229
+ next();
230
+
231
+ }, items[index].time);
232
+
233
+ }
234
+
235
+ };
236
+
237
+
238
+
239
+ // 再生中の動画の停止する
240
+
241
+ var pauseVideos = function() {
242
+
243
+ if (items[index].action.indexOf('play_mp4_') == 0) {
244
+
245
+ pauseMp4(index);
246
+
247
+ }
248
+
249
+ }
250
+
251
+ // 次の動画への切り替えの準備
252
+
253
+ var next = function () {
254
+
255
+ prev = index;
256
+
257
+ index++;
258
+
259
+ if(index > END_INDEX) {
260
+
261
+ index = START_INDEX;
262
+
263
+ }
264
+
265
+
266
+
267
+ show();
268
+
269
+ };
270
+
271
+ return function () {
272
+
273
+ show();
274
+
275
+ };
276
+
277
+ }();
278
+
279
+
280
+
281
+
282
+
283
+ $(function () {
284
+
285
+ $.each(mp4, function(i, val) {
286
+
287
+ if (val.type == 'mp4') {
288
+
289
+ mp4[i].obj = document.getElementById('mp4_video');
290
+
291
+ mp4[i].content = $("#mp4_video");
292
+
293
+ // hls.jsの設定
294
+
295
+ if (Hls.isSupported()) {
296
+
297
+ var hls_config = {
298
+
299
+ maxMaxBufferLength: 20,
300
+
301
+ };
302
+
303
+ var hls = new Hls(hls_config);
304
+
305
+ hls.loadSource(mp4[i].source);
306
+
307
+ hls.attachMedia(mp4[i].obj);
308
+
309
+ } else if (mp4[i].obj.canPlayType('application/vnd.apple.mpegurl')) {
310
+
311
+ mp4[i].obj.src = mp4[i].source;
312
+
313
+ }
314
+
315
+ }
316
+
317
+ });
318
+
319
+ });
320
+
321
+
322
+
323
+
324
+
325
+ window.onload = function() {
326
+
327
+ scene_manager();
328
+
329
+ }
330
+
331
+ ```
332
+
333
+
334
+
335
+ ```kotlin
336
+
337
+ // Activity
338
+
339
+ class MainActivity : AppCompatActivity() {
340
+
341
+
342
+
343
+ private val longPressHandler = Handler(Looper.getMainLooper())
344
+
345
+
346
+
347
+ private var myWebView : WebView? = null
348
+
349
+
350
+
351
+ override fun onCreate(savedInstanceState: Bundle?) {
352
+
353
+ super.onCreate(savedInstanceState)
354
+
355
+ setContentView(R.layout.activity_main)
356
+
357
+
358
+
359
+ myWebView = initWebView()
360
+
361
+ }
362
+
363
+
364
+
365
+
366
+
367
+ override fun onResume() {
368
+
369
+ super.onResume()
370
+
371
+ myWebView!!.clearCache(true)
372
+
373
+ displayWebPage()
374
+
375
+ }
376
+
377
+
378
+
379
+ private fun initWebView() : WebView {
380
+
381
+ // WebViewの設定
382
+
383
+ WebView.setWebContentsDebuggingEnabled(true)
384
+
385
+ val webView : WebView = findViewById(R.id.webView)
386
+
387
+
388
+
389
+ with(webView) {
390
+
391
+ settings.javaScriptEnabled = true
392
+
393
+ settings.mediaPlaybackRequiresUserGesture = false
394
+
395
+ settings.useWideViewPort = true
396
+
397
+ settings.loadWithOverviewMode = true
398
+
399
+ }
400
+
401
+ return webView
402
+
403
+ }
404
+
405
+
406
+
407
+
408
+
409
+ private fun displayWebPage() {
410
+
411
+ val textURL: String = 指定URL
412
+
413
+ myWebView?.loadUrl(textURL)
414
+
415
+ }
416
+
417
+ }
418
+
419
+ ```
420
+
421
+
422
+
423
+ ```kotlin
424
+
425
+ // manifest
426
+
427
+ <uses-permission android:name="android.permission.INTERNET" />
428
+
429
+
430
+
431
+ <application
432
+
433
+ android:allowBackup="true"
434
+
435
+ android:icon="@mipmap/ic_launcher"
436
+
437
+ android:label="@string/app_name"
438
+
439
+ android:roundIcon="@mipmap/ic_launcher_round"
440
+
441
+ android:supportsRtl="true"
442
+
443
+ android:theme="@style/Theme.アプリ名"
444
+
445
+ android:usesCleartextTraffic="true"
446
+
447
+ android:hardwareAccelerated="true"
448
+
449
+ android:largeHeap="true">
450
+
451
+
452
+
453
+ <activity android:name=".MainActivity">
454
+
455
+ <intent-filter>
456
+
457
+ <action android:name="android.intent.action.MAIN" />
458
+
459
+
460
+
461
+ <category android:name="android.intent.category.LAUNCHER" />
462
+
463
+ </intent-filter>
464
+
465
+ </activity>
466
+
467
+
468
+
469
+ </application>
470
+
471
+ ```
472
+
473
+
474
+
475
+ ```kotlin
476
+
477
+ // layout
478
+
479
+ <?xml version="1.0" encoding="utf-8"?>
480
+
481
+ <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
482
+
483
+ xmlns:app="http://schemas.android.com/apk/res-auto"
484
+
485
+ xmlns:tools="http://schemas.android.com/tools"
486
+
487
+ android:layout_width="match_parent"
488
+
489
+ android:layout_height="match_parent"
490
+
491
+ tools:context=".MainActivity">
492
+
493
+
494
+
495
+ <!--WebView-->
496
+
497
+ <WebView
498
+
499
+ android:id="@+id/webView"
500
+
501
+ android:layout_width="match_parent"
502
+
503
+ android:layout_height="match_parent"/>
504
+
505
+ <!--/WebView-->
506
+
507
+
508
+
509
+ </androidx.constraintlayout.widget.ConstraintLayout>
510
+
511
+ ```