فهرست منبع

add some code try to fix

Caijinglong 6 سال پیش
والد
کامیت
1ea1721a60

+ 57 - 0
android/src/main/java/top/kikt/ijkplayer/FileMediaDataSource.java

@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2015 Bilibili
+ * Copyright (C) 2015 Zhang Rui <bbcallen@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package top.kikt.ijkplayer;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.RandomAccessFile;
+
+import tv.danmaku.ijk.media.player.misc.IMediaDataSource;
+
+public class FileMediaDataSource implements IMediaDataSource {
+    private RandomAccessFile mFile;
+    private long mFileSize;
+
+    public FileMediaDataSource(File file) throws IOException {
+        mFile = new RandomAccessFile(file, "r");
+        mFileSize = mFile.length();
+    }
+
+    @Override
+    public int readAt(long position, byte[] buffer, int offset, int size) throws IOException {
+        if (mFile.getFilePointer() != position)
+            mFile.seek(position);
+
+        if (size == 0)
+            return 0;
+
+        return mFile.read(buffer, 0, size);
+    }
+
+    @Override
+    public long getSize() throws IOException {
+        return mFileSize;
+    }
+
+    @Override
+    public void close() throws IOException {
+        mFileSize = 0;
+        mFile.close();
+        mFile = null;
+    }
+}

+ 18 - 4
android/src/main/java/top/kikt/ijkplayer/Ijk.kt

@@ -3,7 +3,10 @@ package top.kikt.ijkplayer
 /// create 2019/3/7 by cai
 
 
+import android.content.Context
 import android.graphics.Bitmap
+import android.media.AudioManager
+import android.net.Uri
 import android.util.Base64
 import io.flutter.plugin.common.MethodCall
 import io.flutter.plugin.common.MethodChannel
@@ -37,6 +40,9 @@ class Ijk(private val registry: PluginRegistry.Registrar, val options: Map<Strin
         methodChannel.setMethodCallHandler(this)
     }
 
+    private val appContext: Context
+        get() = registry.activity().application
+
     private fun configOptions() {
         // see https://www.jianshu.com/p/843c86a9e9ad
         mediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "fflags", "fastseek")
@@ -198,14 +204,22 @@ class Ijk(private val registry: PluginRegistry.Registrar, val options: Map<Strin
             result?.success(true)
         } else {
             throwable.printStackTrace()
-            result?.error("1", "设置资源失败", throwable)
+            result?.error("1", "set resource error", throwable)
         }
     }
 
-    private fun setUri(uri: String, headers: Map<String, String>?, callback: (Throwable?) -> Unit) {
+    private fun setUri(uriString: String, headers: Map<String, String>?, callback: (Throwable?) -> Unit) {
         try {
-//            mediaPlayer.dataSource = uri
-            mediaPlayer.setDataSource(uri, headers)
+            val uri = Uri.parse(uriString)
+//            val scheme = uri.scheme
+//            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M &&
+//                    (TextUtils.isEmpty(scheme) || scheme.equals("file", ignoreCase = true))) {
+//                val dataSource = FileMediaDataSource(File(uri.toString()))
+//                mediaPlayer.setDataSource(dataSource)
+//            } else {
+            mediaPlayer.setDataSource(appContext, uri, headers)
+//            }
+            mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC)
             mediaPlayer.prepareAsync()
             callback(null)
         } catch (e: Exception) {

+ 3 - 0
android/src/main/java/top/kikt/ijkplayer/IjkplayerPlugin.kt

@@ -8,6 +8,7 @@ import io.flutter.plugin.common.MethodChannel
 import io.flutter.plugin.common.MethodChannel.MethodCallHandler
 import io.flutter.plugin.common.MethodChannel.Result
 import io.flutter.plugin.common.PluginRegistry.Registrar
+import tv.danmaku.ijk.media.player.IjkMediaPlayer
 
 
 /**
@@ -17,6 +18,8 @@ class IjkplayerPlugin(private val registrar: Registrar) : MethodCallHandler {
 
 
     override fun onMethodCall(call: MethodCall, result: Result) {
+        IjkMediaPlayer.loadLibrariesOnce(null)
+        IjkMediaPlayer.native_profileBegin("libijkplayer.so")
         handleMethodCall(call, result)
     }
 

+ 3 - 0
android/src/main/java/top/kikt/ijkplayer/NotifyChannel.kt

@@ -21,6 +21,9 @@ class NotifyChannel(val registry: PluginRegistry.Registrar, val textureId: Long,
     init {
         player.setOnPreparedListener {
             logi("prepare $info")
+            player.trackInfo.forEach {
+                
+            }
             channel.invokeMethod("prepare", info)
         }
         player.setOnCompletionListener {

+ 66 - 0
example/android/app/arm64.gradle

@@ -0,0 +1,66 @@
+apply plugin: Arm64Plugin
+
+class Arm64Plugin implements Plugin<Project> {
+    private Properties localProperties
+
+    private Properties readPropertiesIfExist(File propertiesFile) {
+        Properties result = new Properties()
+        if (propertiesFile.exists()) {
+            propertiesFile.withReader('UTF-8') { reader -> result.load(reader) }
+        }
+        return result
+    }
+
+    private String resolveProperty(Project project, String name, String defaultValue) {
+        if (localProperties == null) {
+            localProperties = readPropertiesIfExist(new File(project.projectDir.parentFile, "local.properties"))
+        }
+        String result
+        if (project.hasProperty(name)) {
+            result = project.property(name)
+        }
+        if (result == null) {
+            result = localProperties.getProperty(name)
+        }
+        if (result == null) {
+            result = defaultValue
+        }
+        return result
+    }
+
+    @Override
+    void apply(Project project) {
+        project.android.buildTypes {
+            profile {
+                initWith debug
+                if (it.hasProperty('matchingFallbacks')) {
+                    matchingFallbacks = ['debug', 'release']
+                }
+            }
+            dynamicProfile {
+                initWith debug
+                if (it.hasProperty('matchingFallbacks')) {
+                    matchingFallbacks = ['debug', 'release']
+                }
+            }
+            dynamicRelease {
+                initWith debug
+                if (it.hasProperty('matchingFallbacks')) {
+                    matchingFallbacks = ['debug', 'release']
+                }
+            }
+        }
+
+        String flutterRoot = resolveProperty(project, "flutter.sdk", System.env.FLUTTER_ROOT)
+//        原始jar包文件
+        def zipFile = file("$flutterRoot/bin/cache/artifacts/engine/android-arm64-dynamic-release/flutter.jar")
+
+        // 解压缩目标目录
+        def outputDir = file("$flutterRoot/bin/cache/artifacts/engine/android-arm64-dynamic-release/dist")
+
+//        FileTree jarTree = zipTree(zipFile)
+//
+//        from jarTree
+//        into outputDir
+    }
+}

+ 0 - 1
example/android/app/build.gradle

@@ -23,7 +23,6 @@ if (flutterVersionName == null) {
 
 apply plugin: 'com.android.application'
 apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
-
 android {
     signingConfigs {
         config1 {

+ 3 - 3
example/ios/Podfile.lock

@@ -10,7 +10,7 @@ PODS:
 DEPENDENCIES:
   - Flutter (from `.symlinks/flutter/ios`)
   - flutter_ijkplayer (from `/Users/cai/Documents/GitHub/flutter_ijkplayer/ios/flutter_ijkplayer.podspec`)
-  - photo_manager (from `/Users/cai/.pub-cache/hosted/pub.flutter-io.cn/photo_manager-0.3.3/ios/photo_manager.podspec`)
+  - photo_manager (from `/Users/cai/.pub-cache/hosted/pub.flutter-io.cn/photo_manager-0.3.4/ios/photo_manager.podspec`)
 
 SPEC REPOS:
   https://github.com/cocoapods/specs.git:
@@ -22,7 +22,7 @@ EXTERNAL SOURCES:
   flutter_ijkplayer:
     :path: "/Users/cai/Documents/GitHub/flutter_ijkplayer/ios/flutter_ijkplayer.podspec"
   photo_manager:
-    :path: "/Users/cai/.pub-cache/hosted/pub.flutter-io.cn/photo_manager-0.3.3/ios/photo_manager.podspec"
+    :path: "/Users/cai/.pub-cache/hosted/pub.flutter-io.cn/photo_manager-0.3.4/ios/photo_manager.podspec"
 
 SPEC CHECKSUMS:
   Flutter: 58dd7d1b27887414a370fcccb9e645c08ffd7a6a
@@ -32,4 +32,4 @@ SPEC CHECKSUMS:
 
 PODFILE CHECKSUM: a14c63eb48a9d676ed6d876506b3258fd9c85235
 
-COCOAPODS: 1.6.1
+COCOAPODS: 1.7.1

+ 18 - 4
example/lib/page/network.dart

@@ -17,12 +17,14 @@ class _NetworkPageState extends State<NetworkPage> {
 
     editingController.text =
         "https://www.sample-videos.com/video123/mp4/720/big_buck_bunny_720p_30mb.mp4";
-    editingController.text =
-        "http://img.ksbbs.com/asset/Mon_1703/05cacb4e02f9d9e.mp4";
+    // editingController.text =
+    //     "http://img.ksbbs.com/asset/Mon_1703/05cacb4e02f9d9e.mp4";
 
-    editingController.text =
-        "https://media001.geekbang.org/f433fd1ce5e84d27b1101f0dad72a126/de563bb4aba94b5f95f448b33be4dd9f-9aede6861be944d696fe365f3a33b7b4-sd.m3u8";
+    // editingController.text =
+    //     "https://media001.geekbang.org/f433fd1ce5e84d27b1101f0dad72a126/de563bb4aba94b5f95f448b33be4dd9f-9aede6861be944d696fe365f3a33b7b4-sd.m3u8";
 
+    mediaController
+        .setIjkPlayerOptions([TargetPlatform.android], createIJKOptions());
     // editingController.text = "http://222.207.48.30/hls/startv.m3u8";
 
     // editingController.text = "rtmp://172.16.100.245:1935/live1";
@@ -80,3 +82,15 @@ class _NetworkPageState extends State<NetworkPage> {
     await mediaController.setNetworkDataSource(text, autoPlay: true);
   }
 }
+
+Set<IjkOption> createIJKOptions() {
+  return <IjkOption>[
+    IjkOption(IjkOptionCategory.player, "mediacodec", 0),
+    IjkOption(IjkOptionCategory.player, "opensles", 0),
+    IjkOption(IjkOptionCategory.player, "overlay-format", 0x32335652),
+    IjkOption(IjkOptionCategory.player, "framedrop", 1),
+    IjkOption(IjkOptionCategory.player, "start-on-prepared", 0),
+    IjkOption(IjkOptionCategory.format, "http-detect-range-support", 0),
+    IjkOption(IjkOptionCategory.codec, "skip_loop_filter", 48),
+  ].toSet();
+}

+ 3 - 3
example/pubspec.lock

@@ -21,7 +21,7 @@ packages:
       name: async
       url: "https://pub.flutter-io.cn"
     source: hosted
-    version: "2.2.0"
+    version: "2.1.0"
   boolean_selector:
     dependency: transitive
     description:
@@ -204,7 +204,7 @@ packages:
       name: quiver
       url: "https://pub.flutter-io.cn"
     source: hosted
-    version: "2.0.3"
+    version: "2.0.2"
   sky_engine:
     dependency: transitive
     description: flutter
@@ -251,7 +251,7 @@ packages:
       name: test_api
       url: "https://pub.flutter-io.cn"
     source: hosted
-    version: "0.2.5"
+    version: "0.2.4"
   typed_data:
     dependency: transitive
     description:

+ 538 - 0
log/https-success.log

@@ -0,0 +1,538 @@
+W/Thread-4(10223): type=1400 audit(0.0:58537): avc: denied { search } for name="ctx" dev="debugfs" ino=14718 scontext=u:r:untrusted_app:s0:c209,c256,c512,c768 tcontext=u:object_r:qti_debugfs:s0 tclass=dir permissive=0
+
+D/IJKMEDIA(10223): IjkMediaPlayer_native_profileBegin
+
+W/IJKMEDIA(10223): monstartup already called
+
+D/IJKMEDIA(10223): IjkMediaPlayer_native_setup
+
+I/IJKMEDIA(10223): av_version_info: ff3.4--ijk0.8.7--20180103--001
+
+I/IJKMEDIA(10223): ijk_version_info: k0.8.8-15-ge7fde118
+
+D/IJKMEDIA(10223): ffpipeline_create_from_android()
+
+D/IJKMEDIA(10223): ijkmp_set_inject_opaque(0x2d96)
+
+D/IJKMEDIA(10223): ijkmp_set_inject_opaque()=void
+
+D/IJKMEDIA(10223): ijkmp_set_ijkio_inject_opaque(0x2d96)
+
+D/IJKMEDIA(10223): ijkmp_set_ijkio_inject_opaque()=void
+
+D/IJKMEDIA(10223): ijkmp_android_set_mediacodec_select_callback()
+
+D/IJKMEDIA(10223): ffpipeline_set_mediacodec_select_callback
+
+D/IJKMEDIA(10223): ijkmp_android_set_mediacodec_select_callback()=void
+
+D/IJKMEDIA(10223): IjkMediaPlayer_setOption
+
+D/IJKMEDIA(10223): IjkMediaPlayer_setOptionLong
+
+I/chatty  (10223): uid=10209(com.example.ijkplayer_example) identical 13 lines
+
+D/IJKMEDIA(10223): IjkMediaPlayer_setOptionLong
+
+D/IJKMEDIA(10223): IjkMediaPlayer_setVideoSurface
+
+D/IJKMEDIA(10223): ijkmp_set_android_surface(surface=0x7fde0d0da8)
+
+D/IJKMEDIA(10223): ffpipeline_set_surface()
+
+D/IJKMEDIA(10223): ijkmp_set_android_surface(surface=0x7fde0d0da8)=void
+
+I/flutter (10223): (d)Ijk:onTextureChange 2
+
+I/flutter (10223): (d)Ijk:id = 2 net uri = https://www.sample-videos.com/video123/mp4/720/big_buck_bunny_720p_30mb.mp4 ,headers = {}
+
+D/IJKMEDIA(10223): IjkMediaPlayer_setVolume
+
+D/IJKMEDIA(10223): ijkmp_android_set_volume(1.000000, 1.000000)
+
+D/IJKMEDIA(10223): ffpipeline_set_volume
+
+D/IJKMEDIA(10223): ijkmp_android_set_volume(1.000000, 1.000000)=void
+
+D/tv.danmaku.ijk.media.player.IjkMediaPlayer(10223): Couldn't open file on client side, trying server side
+
+D/IJKMEDIA(10223): IjkMediaPlayer_setDataSourceAndHeaders
+
+V/IJKMEDIA(10223): setDataSource: path https://www.sample-videos.com/video123/mp4/720/big_buck_bunny_720p_30mb.mp4
+
+D/IJKMEDIA(10223): ijkmp_set_data_source(url="https://www.sample-videos.com/video123/mp4/720/big_buck_bunny_720p_30mb.mp4")
+
+D/IJKMEDIA(10223): ijkmp_set_data_source(url="https://www.sample-videos.com/video123/mp4/720/big_buck_bunny_720p_30mb.mp4")=0
+
+D/IJKMEDIA(10223): IjkMediaPlayer_prepareAsync
+
+D/IJKMEDIA(10223): ijkmp_prepare_async()
+
+I/IJKMEDIA(10223): ===== versions =====
+
+I/IJKMEDIA(10223): ijkplayer    : k0.8.8-15-ge7fde118
+
+I/IJKMEDIA(10223): FFmpeg       : ff3.4--ijk0.8.7--20180103--001
+
+I/IJKMEDIA(10223): libavutil    : 55.78.100
+
+I/IJKMEDIA(10223): libavcodec   : 57.107.100
+
+I/IJKMEDIA(10223): libavformat  : 57.83.100
+
+I/IJKMEDIA(10223): libswscale   : 4.8.100
+
+I/IJKMEDIA(10223): SDL_RunThread: [10872] ff_msg_loop
+
+I/IJKMEDIA(10223): libswresample: 2.9.100
+
+I/IJKMEDIA(10223): ===== options =====
+
+D/IJKMEDIA(10223): message_loop
+
+I/IJKMEDIA(10223): player-opts : reconnect                    = 5
+
+I/IJKMEDIA(10223): player-opts : overlay-format               = 842225234
+
+I/IJKMEDIA(10223): player-opts : enable-accurate-seek         = 1
+
+I/IJKMEDIA(10223): player-opts : mediacodec                   = 0
+
+I/IJKMEDIA(10223): player-opts : opensles                     = 0
+
+I/IJKMEDIA(10223): player-opts : framedrop                    = 1
+
+I/IJKMEDIA(10223): player-opts : start-on-prepared            = 0
+
+I/IJKMEDIA(10223): format-opts : ijkapplication               = 480742181888
+
+I/IJKMEDIA(10223): format-opts : ijkiomanager                 = 480447706112
+
+I/IJKMEDIA(10223): format-opts : fflags                       = fastseek
+
+I/IJKMEDIA(10223): format-opts : analyzemaxduration           = 100
+
+I/IJKMEDIA(10223): format-opts : analyzeduration              = 1
+
+I/IJKMEDIA(10223): format-opts : probesize                    = 10240
+
+I/IJKMEDIA(10223): format-opts : flush_packets                = 1
+
+I/IJKMEDIA(10223): format-opts : http-detect-range-support    = 0
+
+I/IJKMEDIA(10223): codec-opts  : skip_loop_filter             = 48
+
+I/IJKMEDIA(10223): ===================
+
+D/IJKMEDIA(10223): FFP_MSG_FLUSH:
+
+D/IJKMEDIA(10223): ijkmp_prepare_async()=0
+
+I/IJKMEDIA(10223): SDL_RunThread: [10873] ff_vout
+
+I/IJKMEDIA(10223): SDL_RunThread: [10874] ff_read
+
+I/tv.danmaku.ijk.media.player.IjkMediaPlayer(10223): onNativeInvoke 1
+
+I/NotifyChannel(10223): onNativeInvoke 1
+
+I/flutter (10223): (i)Ijk:IjkMediaControllerMixin attach [GlobalKey#a9c03]
+
+I/tv.danmaku.ijk.media.player.IjkMediaPlayer(10223): onNativeInvoke 131073
+
+I/NotifyChannel(10223): onNativeInvoke 131073
+
+I/tv.danmaku.ijk.media.player.IjkMediaPlayer(10223): onNativeInvoke 131074
+
+I/NotifyChannel(10223): onNativeInvoke 131074
+
+I/IJKMEDIA(10223): Add dns cache hostname = www.sample-videos.com, ip = 45.249.110.23
+
+I/tv.danmaku.ijk.media.player.IjkMediaPlayer(10223): onNativeInvoke 2
+
+I/NotifyChannel(10223): onNativeInvoke 2
+
+I/tv.danmaku.ijk.media.player.IjkMediaPlayer(10223): onNativeInvoke 3
+
+I/NotifyChannel(10223): onNativeInvoke 3
+
+I/IJKMEDIA(10223): Hit DNS cache hostname = www.sample-videos.com
+
+I/tv.danmaku.ijk.media.player.IjkMediaPlayer(10223): onNativeInvoke 131073
+
+I/NotifyChannel(10223): onNativeInvoke 131073
+
+I/tv.danmaku.ijk.media.player.IjkMediaPlayer(10223): onNativeInvoke 131074
+
+I/NotifyChannel(10223): onNativeInvoke 131074
+
+W/InputTransport(10223): Slow Input: 153ms so far, channel 'ClientState{7f9a4b9 uid 10209 pid 10223} (server)' publisher ~ publishKeyEvent: seq=3, deviceId=4, source=0x101, action=0x0, flags=0x8, keyCode=25, scanCode=114, metaState=0x0, repeatCount=0,downTime=270925038000000, eventTime=270925038000000
+
+I/tv.danmaku.ijk.media.player.IjkMediaPlayer(10223): onNativeInvoke 4
+
+I/NotifyChannel(10223): onNativeInvoke 4
+
+D/IJKMEDIA(10223): FFP_MSG_OPEN_INPUT:
+
+E/IJKMEDIA(10223): Option http-detect-range-support not found.
+
+I/NotifyChannel(10223): onInfoListener 10005, extra = 0, isPlaying = false
+
+I/tv.danmaku.ijk.media.player.IjkMediaPlayer(10223): onNativeInvoke 3
+
+I/NotifyChannel(10223): onNativeInvoke 3
+
+I/IJKMEDIA(10223): Hit DNS cache hostname = www.sample-videos.com
+
+I/tv.danmaku.ijk.media.player.IjkMediaPlayer(10223): onNativeInvoke 131073
+
+I/NotifyChannel(10223): onNativeInvoke 131073
+
+I/tv.danmaku.ijk.media.player.IjkMediaPlayer(10223): onNativeInvoke 131074
+
+I/NotifyChannel(10223): onNativeInvoke 131074
+
+I/tv.danmaku.ijk.media.player.IjkMediaPlayer(10223): onNativeInvoke 4
+
+I/NotifyChannel(10223): onNativeInvoke 4
+
+D/IJKMEDIA(10223): FFP_MSG_FIND_STREAM_INFO:
+
+I/IJKMEDIA(10223): max_frame_duration: 10.000
+
+I/IJKMEDIA(10223): Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'https://www.sample-videos.com/video123/mp4/720/big_buck_bunny_720p_30mb.mp4':
+
+I/IJKMEDIA(10223):   Metadata:
+
+I/IJKMEDIA(10223):     major_brand     :
+
+I/IJKMEDIA(10223): isom
+
+I/IJKMEDIA(10223):
+
+I/IJKMEDIA(10223):     minor_version   :
+
+I/IJKMEDIA(10223): 512
+
+I/IJKMEDIA(10223):
+
+I/IJKMEDIA(10223):     compatible_brands:
+
+I/IJKMEDIA(10223): isomiso2avc1mp41
+
+I/IJKMEDIA(10223):
+
+I/IJKMEDIA(10223):     creation_time   :
+
+I/IJKMEDIA(10223): 1970-01-01T00:00:00.000000Z
+
+I/IJKMEDIA(10223):
+
+I/IJKMEDIA(10223):     encoder         :
+
+I/IJKMEDIA(10223): Lavf53.24.2
+
+I/IJKMEDIA(10223):
+
+I/IJKMEDIA(10223):   Duration:
+
+I/IJKMEDIA(10223): 00:02:50.86
+
+I/IJKMEDIA(10223): , start:
+
+I/IJKMEDIA(10223): 0.000000
+
+I/IJKMEDIA(10223): , bitrate:
+
+I/IJKMEDIA(10223): 1474 kb/s
+
+I/IJKMEDIA(10223):
+
+I/IJKMEDIA(10223):     Stream #0:0
+
+I/IJKMEDIA(10223): (und)
+
+I/IJKMEDIA(10223): : Video: h264 (avc1 / 0x31637661), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 1086 kb/s
+
+I/IJKMEDIA(10223): ,
+
+I/IJKMEDIA(10223): 25 fps,
+
+I/IJKMEDIA(10223): 25 tbr,
+
+I/IJKMEDIA(10223): 12800 tbn,
+
+I/IJKMEDIA(10223): 50 tbc
+
+I/IJKMEDIA(10223):  (default)
+
+I/IJKMEDIA(10223):
+
+I/IJKMEDIA(10223):     Metadata:
+
+I/IJKMEDIA(10223):       creation_time   :
+
+I/IJKMEDIA(10223): 1970-01-01T00:00:00.000000Z
+
+I/NotifyChannel(10223): onInfoListener 10006, extra = 0, isPlaying = false
+
+I/IJKMEDIA(10223):
+
+I/IJKMEDIA(10223):       handler_name    :
+
+I/IJKMEDIA(10223): VideoHandler
+
+I/IJKMEDIA(10223):
+
+I/IJKMEDIA(10223):     Stream #0:1
+
+I/IJKMEDIA(10223): (und)
+
+I/IJKMEDIA(10223): : Audio: aac (mp4a / 0x6134706D), 48000 Hz, 5.1, fltp, 383 kb/s
+
+I/IJKMEDIA(10223):  (default)
+
+I/IJKMEDIA(10223):
+
+I/IJKMEDIA(10223):     Metadata:
+
+I/IJKMEDIA(10223):       creation_time   :
+
+I/IJKMEDIA(10223): 1970-01-01T00:00:00.000000Z
+
+I/IJKMEDIA(10223):
+
+I/IJKMEDIA(10223):       handler_name    :
+
+I/IJKMEDIA(10223): SoundHandler
+
+I/IJKMEDIA(10223):
+
+E/IJKMEDIA(10223): SDL_Android_AudioTrack_new_from_spec: invalid channel 0
+
+E/IJKMEDIA(10223): aout_open_audio_n: failed to new AudioTrcak()
+
+W/IJKMEDIA(10223): SDL_OpenAudio (6 channels, 48000 Hz): (null)
+
+E/IJKMEDIA(10223): SDL_Android_AudioTrack_new_from_spec: invalid channel 0
+
+E/IJKMEDIA(10223): aout_open_audio_n: failed to new AudioTrcak()
+
+W/IJKMEDIA(10223): SDL_OpenAudio (4 channels, 48000 Hz): (null)
+
+I/IJKMEDIA(10223): SDL_Android_AudioTrack: CHANNEL_OUT_STEREO
+
+I/IJKMEDIA(10223): SDL_Android_AudioTrack: ENCODING_PCM_16BIT
+
+D/AudioTrack(10223): set(): streamType -1, sampleRate 48000, format 0x1, channelMask 0x3, frameCount 3848, flags #0, notificationFrames 0, sessionId 0, transferType 3, uid -1, pid -1
+
+W/AudioTrack(10223): Use of stream types is deprecated for operations other than volume control
+
+W/AudioTrack(10223): See the documentation of AudioTrack() for what to use instead with android.media.AudioAttributes to qualify your playback use case
+
+I/IJKMEDIA(10223): SDL_Android_AudioTrack_new_from_spec: init volume as 1.000000/(0.000000,1.000000)
+
+I/IJKMEDIA(10223): audio_session_id = 53289
+
+I/IJKMEDIA(10223): AudioCodec: avcodec, aac
+
+I/IJKMEDIA(10223): SDL_RunThread: [10897] ff_aout_android
+
+I/IJKMEDIA(10223): VideoCodec: avcodec, h264
+
+W/IJKMEDIA(10223): fps: 25.000000 (normal)
+
+W/IJKMEDIA(10223): fps: 25.000000 (normal)
+
+D/IJKMEDIA(10223): FFP_MSG_COMPONENT_OPEN:
+
+I/IJKMEDIA(10223): SDL_RunThread: [10898] ff_audio_dec
+
+D/IJKMEDIA(10223): FFP_MSG_VIDEO_SIZE_CHANGED: 1280, 720
+
+D/IJKMEDIA(10223): FFP_MSG_SAR_CHANGED: 1, 1
+
+D/IJKMEDIA(10223): ijkmp_get_msg: FFP_MSG_PREPARED
+
+D/IJKMEDIA(10223): FFP_MSG_PREPARED:
+
+D/IJKMEDIA(10223): FFP_MSG_BUFFERING_START:
+
+I/NotifyChannel(10223): onInfoListener 10007, extra = 0, isPlaying = false
+
+I/IJKMEDIA(10223): SDL_RunThread: [10907] ff_video_dec
+
+I/NotifyChannel(10223): prepare {duration=170.859, tcpSpeed=40656, isPlaying=false, outputFps=0.0, currentPosition=0.0, width=1280, degree=0, height=720}
+
+D/IJKMEDIA(10223): FFP_MSG_VIDEO_ROTATION_CHANGED: 0
+
+I/NotifyChannel(10223): onInfoListener 701, extra = 0, isPlaying = false
+
+I/NotifyChannel(10223): onInfoListener 10001, extra = 0, isPlaying = false
+
+I/flutter (10223): (i)Ijk:IJKController[3] play
+
+D/IJKMEDIA(10223): IjkMediaPlayer_start
+
+D/IJKMEDIA(10223): ijkmp_start()
+
+D/IJKMEDIA(10223): ijkmp_start()=0
+
+D/IJKMEDIA(10223): ijkmp_get_msg: FFP_REQ_START
+
+I/flutter (10223): (d)Ijk:onRotateChanged , info = {"duration":170.859,"tcpSpeed":40656,"isPlaying":false,"outputFps":0.0,"currentPosition":0.0,"width":1280,"degree":0,"height":720}
+
+D/IJKMEDIA(10223): ijkmp_get_msg: FFP_REQ_START
+
+D/IJKMEDIA(10223): SDL_VoutFFmpeg_CreateOverlay(w=1280, h=720, fmt=RV32(0x32335652, dp=0x6fdcea1ac0)
+
+D/IJKMEDIA(10223): FFP_MSG_VIDEO_SIZE_CHANGED: 1280, 720
+
+D/IJKMEDIA(10223): Video: first frame decoded
+
+D/IJKMEDIA(10223): FFP_MSG_VIDEO_DECODED_START:
+
+D/IJKMEDIA(10223): SDL_VoutFFmpeg_CreateOverlay(w=1280, h=720, fmt=RV32(0x32335652, dp=0x6fdcea1ac0)
+
+D/IJKMEDIA(10223): FFP_MSG_VIDEO_SIZE_CHANGED: 1280, 720
+
+I/NotifyChannel(10223): onInfoListener 10004, extra = 0, isPlaying = true
+
+D/IJKMEDIA(10223): SDL_VoutFFmpeg_CreateOverlay(w=1280, h=720, fmt=RV32(0x32335652, dp=0x6fdcea1ac0)
+
+D/IJKMEDIA(10223): FFP_MSG_VIDEO_SIZE_CHANGED: 1280, 720
+
+I/NotifyChannel(10223): completion buffer update {duration=170.859, tcpSpeed=72174, isPlaying=true, outputFps=0.0, currentPosition=0.0, width=1280, degree=0, height=720} 0
+
+I/NotifyChannel(10223): completion buffer update {duration=170.859, tcpSpeed=59764, isPlaying=true, outputFps=0.0, currentPosition=0.0, width=1280, degree=0, height=720} 0
+
+D/IJKMEDIA(10223): avcodec/Audio: first frame decoded
+
+D/IJKMEDIA(10223): FFP_MSG_BUFFERING_END:
+
+D/IJKMEDIA(10223): ANativeWindow_setBuffersGeometry: w=1, h=1, f=(0x1) => w=1280, h=720, f=RV32(0x32335652)
+
+D/IJKMEDIA(10223): FFP_MSG_AUDIO_DECODED_START:
+
+D/IJKMEDIA(10223): FFP_MSG_AUDIO_RENDERING_START:
+
+I/NotifyChannel(10223): onInfoListener 702, extra = 0, isPlaying = true
+
+I/NotifyChannel(10223): onInfoListener 10003, extra = 0, isPlaying = true
+
+I/NotifyChannel(10223): onInfoListener 10002, extra = 0, isPlaying = true
+
+D/IJKMEDIA(10223): FFP_MSG_VIDEO_RENDERING_START:
+
+I/tv.danmaku.ijk.media.player.IjkMediaPlayer(10223): Info: MEDIA_INFO_VIDEO_RENDERING_START
+
+I/NotifyChannel(10223): onInfoListener 3, extra = 0, isPlaying = true
+
+D/libEGL  (10223): eglInitialize: enter
+
+D/libEGL  (10223): eglInitialize: exit(res=1)
+
+D/libEGL  (10223): eglInitialize: enter
+
+D/libEGL  (10223): eglInitialize: exit(res=1)
+
+D/libEGL  (10223): eglInitialize: enter
+
+D/libEGL  (10223): eglInitialize: exit(res=1)
+
+I/NotifyChannel(10223): completion buffer update {duration=170.859, tcpSpeed=84192, isPlaying=true, outputFps=25.0, currentPosition=0.622, width=1280, degree=0, height=720} 0
+
+I/NotifyChannel(10223): completion buffer update {duration=170.859, tcpSpeed=142298, isPlaying=true, outputFps=24.242424, currentPosition=1.236, width=1280, degree=0, height=720} 0
+
+D/IJKMEDIA(10223): FFP_MSG_BUFFERING_START:
+
+I/NotifyChannel(10223): onInfoListener 701, extra = 0, isPlaying = true
+
+I/NotifyChannel(10223): completion buffer update {duration=170.859, tcpSpeed=240569, isPlaying=true, outputFps=25.0, currentPosition=2.23, width=1280, degree=0, height=720} 1
+
+D/IJKMEDIA(10223): FFP_MSG_BUFFERING_END:
+
+I/NotifyChannel(10223): completion buffer update {duration=170.859, tcpSpeed=276968, isPlaying=true, outputFps=25.0, currentPosition=2.235, width=1280, degree=0, height=720} 1
+
+I/NotifyChannel(10223): onInfoListener 702, extra = 0, isPlaying = true
+
+I/NotifyChannel(10223): completion buffer update {duration=170.859, tcpSpeed=283558, isPlaying=true, outputFps=26.666666, currentPosition=3.01, width=1280, degree=0, height=720} 3
+
+I/NotifyChannel(10223): completion buffer update {duration=170.859, tcpSpeed=279517, isPlaying=true, outputFps=25.0, currentPosition=3.629, width=1280, degree=0, height=720} 3
+
+I/NotifyChannel(10223): completion buffer update {duration=170.859, tcpSpeed=178844, isPlaying=true, outputFps=24.242424, currentPosition=5.472, width=1280, degree=0, height=720} 4
+
+I/NotifyChannel(10223): completion buffer update {duration=170.859, tcpSpeed=183652, isPlaying=true, outputFps=24.242424, currentPosition=6.091, width=1280, degree=0, height=720} 4
+
+I/NotifyChannel(10223): completion buffer update {duration=170.859, tcpSpeed=163397, isPlaying=true, outputFps=25.806452, currentPosition=6.698, width=1280, degree=0, height=720} 4
+
+I/NotifyChannel(10223): completion buffer update {duration=170.859, tcpSpeed=194323, isPlaying=true, outputFps=25.0, currentPosition=7.314, width=1280, degree=0, height=720} 5
+
+I/NotifyChannel(10223): completion buffer update {duration=170.859, tcpSpeed=156046, isPlaying=true, outputFps=25.0, currentPosition=8.132, width=1280, degree=0, height=720} 6
+
+I/NotifyChannel(10223): completion buffer update {duration=170.859, tcpSpeed=141038, isPlaying=true, outputFps=25.0, currentPosition=8.742, width=1280, degree=0, height=720} 6
+
+I/NotifyChannel(10223): completion buffer update {duration=170.859, tcpSpeed=151399, isPlaying=true, outputFps=25.0, currentPosition=9.369, width=1280, degree=0, height=720} 7
+
+I/NotifyChannel(10223): completion buffer update {duration=170.859, tcpSpeed=145600, isPlaying=true, outputFps=25.0, currentPosition=9.973, width=1280, degree=0, height=720} 7
+
+I/NotifyChannel(10223): completion buffer update {duration=170.859, tcpSpeed=167079, isPlaying=true, outputFps=25.0, currentPosition=10.498, width=1280, degree=0, height=720} 8
+
+I/flutter (10223): (i)Ijk:IjkMediaControllerMixin detach [GlobalKey#a9c03]
+
+D/IJKMEDIA(10223): IjkMediaPlayer_native_profileBegin
+
+W/IJKMEDIA(10223): monstartup already called
+
+D/IJKMEDIA(10223): IjkMediaPlayer_native_profileBegin
+
+W/IJKMEDIA(10223): monstartup already called
+
+D/IJKMEDIA(10223): ijkmp_stop()
+
+D/IJKMEDIA(10223): message_loop exit
+
+I/IJKMEDIA(10223): SDL_JNI_DetachThreadEnv: [10872]
+
+D/IJKMEDIA(10223): ijkmp_stop()=0
+
+D/IJKMEDIA(10223): IjkMediaPlayer_release
+
+D/IJKMEDIA(10223): ijkmp_set_android_surface(surface=0x0)
+
+D/IJKMEDIA(10223): ffpipeline_set_surface()
+
+D/IJKMEDIA(10223): ijkmp_set_android_surface(surface=0x0)=void
+
+D/IJKMEDIA(10223): ijkmp_shutdown_l()
+
+I/IJKMEDIA(10223): SDL_JNI_DetachThreadEnv: [10873]
+
+E/IJKMEDIA(10223): Stream ends prematurely at 2296048, should be 31491130
+
+I/IJKMEDIA(10223): SDL_JNI_DetachThreadEnv: [10874]
+
+I/IJKMEDIA(10223): SDL_JNI_DetachThreadEnv: [10898]
+
+D/AudioTrack(10223): stop() called with 514624 frames delivered
+
+I/IJKMEDIA(10223): SDL_JNI_DetachThreadEnv: [10897]
+
+I/IJKMEDIA(10223): convert image convert_frame_count = 0
+
+I/IJKMEDIA(10223): SDL_JNI_DetachThreadEnv: [10907]
+
+E/IJKMEDIA(10223): SDL_Overlay(ffmpeg): overlay_free_l(0x6fe4391be0)
+
+E/IJKMEDIA(10223): SDL_Overlay(ffmpeg): overlay_free_l(0x6fe4391c50)
+
+E/IJKMEDIA(10223): SDL_Overlay(ffmpeg): overlay_free_l(0x6fe4391cc0)
+
+D/IJKMEDIA(10223): ijkmp_shutdown_l()=void
+
+D/IJKMEDIA(10223): ijkmp_dec_ref(): ref=0
+
+D/IJKMEDIA(10223): ijkmp_shutdown_l()
+
+D/IJKMEDIA(10223): ijkmp_shutdown_l()=void
+

+ 514 - 0
log/m3u8-error.log

@@ -0,0 +1,514 @@
+D/IJKMEDIA(10223): IjkMediaPlayer_native_profileBegin
+
+W/IJKMEDIA(10223): monstartup already called
+
+D/IJKMEDIA(10223): IjkMediaPlayer_native_setup
+
+I/IJKMEDIA(10223): av_version_info: ff3.4--ijk0.8.7--20180103--001
+
+I/IJKMEDIA(10223): ijk_version_info: k0.8.8-15-ge7fde118
+
+D/IJKMEDIA(10223): ffpipeline_create_from_android()
+
+D/IJKMEDIA(10223): ijkmp_set_inject_opaque(0x2f76)
+
+D/IJKMEDIA(10223): ijkmp_set_inject_opaque()=void
+
+D/IJKMEDIA(10223): ijkmp_set_ijkio_inject_opaque(0x2f76)
+
+D/IJKMEDIA(10223): ijkmp_set_ijkio_inject_opaque()=void
+
+D/IJKMEDIA(10223): ijkmp_android_set_mediacodec_select_callback()
+
+D/IJKMEDIA(10223): ffpipeline_set_mediacodec_select_callback
+
+D/IJKMEDIA(10223): ijkmp_android_set_mediacodec_select_callback()=void
+
+D/IJKMEDIA(10223): IjkMediaPlayer_setOption
+
+D/IJKMEDIA(10223): IjkMediaPlayer_setOptionLong
+
+I/chatty  (10223): uid=10209(com.example.ijkplayer_example) identical 13 lines
+
+D/IJKMEDIA(10223): IjkMediaPlayer_setOptionLong
+
+D/IJKMEDIA(10223): IjkMediaPlayer_setVideoSurface
+
+D/IJKMEDIA(10223): ijkmp_set_android_surface(surface=0x7fde0d0da8)
+
+D/IJKMEDIA(10223): ffpipeline_set_surface()
+
+D/IJKMEDIA(10223): ijkmp_set_android_surface(surface=0x7fde0d0da8)=void
+
+I/flutter (10223): (d)Ijk:onTextureChange 1
+
+I/flutter (10223): (d)Ijk:id = 1 net uri = https://media001.geekbang.org/f433fd1ce5e84d27b1101f0dad72a126/de563bb4aba94b5f95f448b33be4dd9f-9aede6861be944d696fe365f3a33b7b4-sd.m3u8 ,headers = {}
+
+D/IJKMEDIA(10223): IjkMediaPlayer_setVolume
+
+D/IJKMEDIA(10223): ijkmp_android_set_volume(1.000000, 1.000000)
+
+D/IJKMEDIA(10223): ffpipeline_set_volume
+
+D/IJKMEDIA(10223): ijkmp_android_set_volume(1.000000, 1.000000)=void
+
+D/tv.danmaku.ijk.media.player.IjkMediaPlayer(10223): Couldn't open file on client side, trying server side
+
+D/IJKMEDIA(10223): IjkMediaPlayer_setDataSourceAndHeaders
+
+V/IJKMEDIA(10223): setDataSource: path https://media001.geekbang.org/f433fd1ce5e84d27b1101f0dad72a126/de563bb4aba94b5f95f448b33be4dd9f-9aede6861be944d696fe365f3a33b7b4-sd.m3u8
+
+D/IJKMEDIA(10223): ijkmp_set_data_source(url="https://media001.geekbang.org/f433fd1ce5e84d27b1101f0dad72a126/de563bb4aba94b5f95f448b33be4dd9f-9aede6861be944d696fe365f3a33b7b4-sd.m3u8")
+
+D/IJKMEDIA(10223): ijkmp_set_data_source(url="https://media001.geekbang.org/f433fd1ce5e84d27b1101f0dad72a126/de563bb4aba94b5f95f448b33be4dd9f-9aede6861be944d696fe365f3a33b7b4-sd.m3u8")=0
+
+D/IJKMEDIA(10223): IjkMediaPlayer_prepareAsync
+
+D/IJKMEDIA(10223): ijkmp_prepare_async()
+
+I/IJKMEDIA(10223): ===== versions =====
+
+I/IJKMEDIA(10223): ijkplayer    : k0.8.8-15-ge7fde118
+
+I/IJKMEDIA(10223): FFmpeg       : ff3.4--ijk0.8.7--20180103--001
+
+I/IJKMEDIA(10223): libavutil    : 55.78.100
+
+I/IJKMEDIA(10223): libavcodec   : 57.107.100
+
+I/IJKMEDIA(10223): libavformat  : 57.83.100
+
+I/IJKMEDIA(10223): libswscale   : 4.8.100
+
+I/IJKMEDIA(10223): libswresample: 2.9.100
+
+I/IJKMEDIA(10223): ===== options =====
+
+I/IJKMEDIA(10223): player-opts : reconnect                    = 5
+
+I/IJKMEDIA(10223): player-opts : overlay-format               = 842225234
+
+I/IJKMEDIA(10223): player-opts : enable-accurate-seek         = 1
+
+I/IJKMEDIA(10223): player-opts : mediacodec                   = 0
+
+I/IJKMEDIA(10223): player-opts : opensles                     = 0
+
+I/IJKMEDIA(10223): player-opts : framedrop                    = 1
+
+I/IJKMEDIA(10223): player-opts : start-on-prepared            = 0
+
+I/IJKMEDIA(10223): format-opts : ijkapplication               = 480570153696
+
+I/IJKMEDIA(10223): format-opts : ijkiomanager                 = 480810515456
+
+I/IJKMEDIA(10223): format-opts : fflags                       = fastseek
+
+I/IJKMEDIA(10223): format-opts : analyzemaxduration           = 100
+
+I/IJKMEDIA(10223): format-opts : analyzeduration              = 1
+
+I/IJKMEDIA(10223): format-opts : probesize                    = 10240
+
+I/IJKMEDIA(10223): format-opts : flush_packets                = 1
+
+I/IJKMEDIA(10223): format-opts : http-detect-range-support    = 0
+
+I/IJKMEDIA(10223): codec-opts  : skip_loop_filter             = 48
+
+I/IJKMEDIA(10223): ===================
+
+I/IJKMEDIA(10223): SDL_RunThread: [10641] ff_msg_loop
+
+D/IJKMEDIA(10223): message_loop
+
+D/IJKMEDIA(10223): FFP_MSG_FLUSH:
+
+D/IJKMEDIA(10223): ijkmp_prepare_async()=0
+
+I/IJKMEDIA(10223): SDL_RunThread: [10643] ff_read
+
+I/tv.danmaku.ijk.media.player.IjkMediaPlayer(10223): onNativeInvoke 1
+
+I/NotifyChannel(10223): onNativeInvoke 1
+
+I/IJKMEDIA(10223): Hit DNS cache hostname = media001.geekbang.org
+
+I/tv.danmaku.ijk.media.player.IjkMediaPlayer(10223): onNativeInvoke 131073
+
+I/NotifyChannel(10223): onNativeInvoke 131073
+
+I/IJKMEDIA(10223): SDL_RunThread: [10642] ff_vout
+
+I/flutter (10223): (i)Ijk:IjkMediaControllerMixin attach [GlobalKey#c70eb]
+
+I/tv.danmaku.ijk.media.player.IjkMediaPlayer(10223): onNativeInvoke 131074
+
+I/NotifyChannel(10223): onNativeInvoke 131074
+
+I/tv.danmaku.ijk.media.player.IjkMediaPlayer(10223): onNativeInvoke 2
+
+I/NotifyChannel(10223): onNativeInvoke 2
+
+I/IJKMEDIA(10223): Opening 'https://media001.geekbang.org/f433fd1ce5e84d27b1101f0dad72a126/de563bb4aba94b5f95f448b33be4dd9f-b64cf280cabc4d9c202a62095ae10e95-sd-00001.ts' for reading
+
+I/tv.danmaku.ijk.media.player.IjkMediaPlayer(10223): onNativeInvoke 1
+
+I/NotifyChannel(10223): onNativeInvoke 1
+
+I/IJKMEDIA(10223): Hit DNS cache hostname = media001.geekbang.org
+
+I/tv.danmaku.ijk.media.player.IjkMediaPlayer(10223): onNativeInvoke 131073
+
+I/NotifyChannel(10223): onNativeInvoke 131073
+
+I/tv.danmaku.ijk.media.player.IjkMediaPlayer(10223): onNativeInvoke 131074
+
+I/NotifyChannel(10223): onNativeInvoke 131074
+
+I/tv.danmaku.ijk.media.player.IjkMediaPlayer(10223): onNativeInvoke 2
+
+I/NotifyChannel(10223): onNativeInvoke 2
+
+E/IJKMEDIA(10223): Option http-detect-range-support not found.
+
+D/IJKMEDIA(10223): FFP_MSG_OPEN_INPUT:
+
+I/NotifyChannel(10223): onInfoListener 10005, extra = 0, isPlaying = false
+
+E/IJKMEDIA(10223): Invalid NAL unit 0, skipping.
+
+W/IJKMEDIA(10223): Stream #0: not enough frames to estimate rate; consider increasing probesize
+
+W/IJKMEDIA(10223): Could not find codec parameters for stream 1 (Audio: aac ([15][0][0][0] / 0x000F), 0 channels, fltp): unspecified sample rate
+
+W/IJKMEDIA(10223): Consider increasing the value for the 'analyzeduration' and 'probesize' options
+
+I/IJKMEDIA(10223): max_frame_duration: 10.000
+
+D/IJKMEDIA(10223): FFP_MSG_FIND_STREAM_INFO:
+
+I/IJKMEDIA(10223): Input #0, hls,applehttp, from 'https://media001.geekbang.org/f433fd1ce5e84d27b1101f0dad72a126/de563bb4aba94b5f95f448b33be4dd9f-9aede6861be944d696fe365f3a33b7b4-sd.m3u8':
+
+I/IJKMEDIA(10223):   Duration:
+
+I/IJKMEDIA(10223): 00:04:45.96
+
+I/IJKMEDIA(10223): , start:
+
+I/IJKMEDIA(10223): 1.480000
+
+I/IJKMEDIA(10223): , bitrate:
+
+I/IJKMEDIA(10223): 0 kb/s
+
+I/IJKMEDIA(10223):
+
+I/IJKMEDIA(10223):   Program 0
+
+I/IJKMEDIA(10223):     Metadata:
+
+I/IJKMEDIA(10223):       variant_bitrate :
+
+I/IJKMEDIA(10223): 0
+
+I/IJKMEDIA(10223):
+
+I/IJKMEDIA(10223):     Stream #0:0
+
+I/IJKMEDIA(10223): : Video: h264 ([27][0][0][0] / 0x001B), yuv420p, 1280x720 [SAR 1:1 DAR 16:9]
+
+I/IJKMEDIA(10223): ,
+
+I/IJKMEDIA(10223): 25 tbr,
+
+I/IJKMEDIA(10223): 90k tbn,
+
+I/IJKMEDIA(10223): 50 tbc
+
+I/IJKMEDIA(10223):
+
+I/IJKMEDIA(10223):     Metadata:
+
+I/IJKMEDIA(10223):       variant_bitrate :
+
+I/IJKMEDIA(10223): 0
+
+I/IJKMEDIA(10223):
+
+I/IJKMEDIA(10223):     Stream #0:1
+
+I/IJKMEDIA(10223): : Audio: aac ([15][0][0][0] / 0x000F), 0 channels, fltp
+
+I/IJKMEDIA(10223):
+
+I/IJKMEDIA(10223):     Metadata:
+
+I/IJKMEDIA(10223):       variant_bitrate :
+
+I/IJKMEDIA(10223): 0
+
+I/IJKMEDIA(10223):
+
+I/NotifyChannel(10223): onInfoListener 10006, extra = 0, isPlaying = false
+
+I/IJKMEDIA(10223): VideoCodec: avcodec, h264
+
+W/IJKMEDIA(10223): fps: 25.000000 (normal)
+
+I/IJKMEDIA(10223): SDL_RunThread: [10651] ff_video_dec
+
+D/IJKMEDIA(10223): FFP_MSG_COMPONENT_OPEN:
+
+D/IJKMEDIA(10223): FFP_MSG_VIDEO_SIZE_CHANGED: 1280, 720
+
+D/IJKMEDIA(10223): FFP_MSG_SAR_CHANGED: 1, 1
+
+D/IJKMEDIA(10223): ijkmp_get_msg: FFP_MSG_PREPARED
+
+D/IJKMEDIA(10223): FFP_MSG_PREPARED:
+
+D/IJKMEDIA(10223): FFP_MSG_VIDEO_ROTATION_CHANGED: 0
+
+D/IJKMEDIA(10223): FFP_MSG_BUFFERING_START:
+
+I/NotifyChannel(10223): onInfoListener 10007, extra = 0, isPlaying = false
+
+I/NotifyChannel(10223): prepare {duration=285.96, tcpSpeed=111723, isPlaying=false, outputFps=0.0, currentPosition=0.0, width=1280, degree=0, height=720}
+
+I/NotifyChannel(10223): onInfoListener 10001, extra = 0, isPlaying = false
+
+I/NotifyChannel(10223): onInfoListener 701, extra = 0, isPlaying = false
+
+I/flutter (10223): (i)Ijk:IJKController[2] play
+
+D/IJKMEDIA(10223): IjkMediaPlayer_start
+
+D/IJKMEDIA(10223): ijkmp_start()
+
+D/IJKMEDIA(10223): ijkmp_start()=0
+
+D/IJKMEDIA(10223): ijkmp_get_msg: FFP_REQ_START
+
+I/flutter (10223): (d)Ijk:onRotateChanged , info = {"duration":285.96,"tcpSpeed":111723,"isPlaying":false,"outputFps":0.0,"currentPosition":0.0,"width":1280,"degree":0,"height":720}
+
+D/IJKMEDIA(10223): ijkmp_get_msg: FFP_REQ_START
+
+I/NotifyChannel(10223): completion buffer update {duration=285.96, tcpSpeed=137689, isPlaying=true, outputFps=0.0, currentPosition=0.0, width=1280, degree=0, height=720} 0
+
+D/IJKMEDIA(10223): SDL_VoutFFmpeg_CreateOverlay(w=1280, h=720, fmt=RV32(0x32335652, dp=0x6fdcf88e40)
+
+D/IJKMEDIA(10223): FFP_MSG_VIDEO_SIZE_CHANGED: 1280, 720
+
+D/IJKMEDIA(10223): Video: first frame decoded
+
+D/IJKMEDIA(10223): FFP_MSG_VIDEO_DECODED_START:
+
+D/IJKMEDIA(10223): SDL_VoutFFmpeg_CreateOverlay(w=1280, h=720, fmt=RV32(0x32335652, dp=0x6fdcf88e40)
+
+D/IJKMEDIA(10223): FFP_MSG_VIDEO_SIZE_CHANGED: 1280, 720
+
+I/NotifyChannel(10223): onInfoListener 10004, extra = 0, isPlaying = true
+
+D/IJKMEDIA(10223): SDL_VoutFFmpeg_CreateOverlay(w=1280, h=720, fmt=RV32(0x32335652, dp=0x6fdcf88e40)
+
+D/IJKMEDIA(10223): FFP_MSG_VIDEO_SIZE_CHANGED: 1280, 720
+
+D/IJKMEDIA(10223): FFP_MSG_BUFFERING_END:
+
+I/NotifyChannel(10223): completion buffer update {duration=285.96, tcpSpeed=1010080, isPlaying=true, outputFps=0.0, currentPosition=0.0, width=1280, degree=0, height=720} 0
+
+I/NotifyChannel(10223): onInfoListener 702, extra = 0, isPlaying = true
+
+D/IJKMEDIA(10223): ANativeWindow_setBuffersGeometry: w=1, h=1, f=(0x1) => w=1280, h=720, f=RV32(0x32335652)
+
+D/IJKMEDIA(10223): FFP_MSG_VIDEO_RENDERING_START:
+
+I/tv.danmaku.ijk.media.player.IjkMediaPlayer(10223): Info: MEDIA_INFO_VIDEO_RENDERING_START
+
+I/NotifyChannel(10223): onInfoListener 3, extra = 0, isPlaying = true
+
+D/libEGL  (10223): eglInitialize: enter
+
+D/libEGL  (10223): eglInitialize: exit(res=1)
+
+D/libEGL  (10223): eglInitialize: enter
+
+D/libEGL  (10223): eglInitialize: exit(res=1)
+
+I/IJKMEDIA(10223): Opening 'https://media001.geekbang.org/f433fd1ce5e84d27b1101f0dad72a126/de563bb4aba94b5f95f448b33be4dd9f-b64cf280cabc4d9c202a62095ae10e95-sd-00002.ts' for reading
+
+I/tv.danmaku.ijk.media.player.IjkMediaPlayer(10223): onNativeInvoke 1
+
+I/NotifyChannel(10223): onNativeInvoke 1
+
+I/IJKMEDIA(10223): Hit DNS cache hostname = media001.geekbang.org
+
+I/tv.danmaku.ijk.media.player.IjkMediaPlayer(10223): onNativeInvoke 131073
+
+I/NotifyChannel(10223): onNativeInvoke 131073
+
+I/tv.danmaku.ijk.media.player.IjkMediaPlayer(10223): onNativeInvoke 131074
+
+I/NotifyChannel(10223): onNativeInvoke 131074
+
+I/tv.danmaku.ijk.media.player.IjkMediaPlayer(10223): onNativeInvoke 2
+
+I/NotifyChannel(10223): onNativeInvoke 2
+
+I/NotifyChannel(10223): completion buffer update {duration=285.96, tcpSpeed=2543365, isPlaying=true, outputFps=25.806452, currentPosition=0.515, width=1280, degree=0, height=720} 3
+
+I/IJKMEDIA(10223): Opening 'https://media001.geekbang.org/f433fd1ce5e84d27b1101f0dad72a126/de563bb4aba94b5f95f448b33be4dd9f-b64cf280cabc4d9c202a62095ae10e95-sd-00003.ts' for reading
+
+I/tv.danmaku.ijk.media.player.IjkMediaPlayer(10223): onNativeInvoke 1
+
+I/NotifyChannel(10223): onNativeInvoke 1
+
+I/IJKMEDIA(10223): Hit DNS cache hostname = media001.geekbang.org
+
+I/tv.danmaku.ijk.media.player.IjkMediaPlayer(10223): onNativeInvoke 131073
+
+I/NotifyChannel(10223): onNativeInvoke 131073
+
+I/tv.danmaku.ijk.media.player.IjkMediaPlayer(10223): onNativeInvoke 131074
+
+I/NotifyChannel(10223): onNativeInvoke 131074
+
+I/tv.danmaku.ijk.media.player.IjkMediaPlayer(10223): onNativeInvoke 2
+
+I/NotifyChannel(10223): onNativeInvoke 2
+
+I/NotifyChannel(10223): completion buffer update {duration=285.96, tcpSpeed=3215354, isPlaying=true, outputFps=25.0, currentPosition=1.026, width=1280, degree=0, height=720} 7
+
+I/IJKMEDIA(10223): Opening 'https://media001.geekbang.org/f433fd1ce5e84d27b1101f0dad72a126/de563bb4aba94b5f95f448b33be4dd9f-b64cf280cabc4d9c202a62095ae10e95-sd-00004.ts' for reading
+
+I/tv.danmaku.ijk.media.player.IjkMediaPlayer(10223): onNativeInvoke 1
+
+I/NotifyChannel(10223): onNativeInvoke 1
+
+I/IJKMEDIA(10223): Hit DNS cache hostname = media001.geekbang.org
+
+I/tv.danmaku.ijk.media.player.IjkMediaPlayer(10223): onNativeInvoke 131073
+
+I/NotifyChannel(10223): onNativeInvoke 131073
+
+I/tv.danmaku.ijk.media.player.IjkMediaPlayer(10223): onNativeInvoke 131074
+
+I/NotifyChannel(10223): onNativeInvoke 131074
+
+I/tv.danmaku.ijk.media.player.IjkMediaPlayer(10223): onNativeInvoke 2
+
+I/NotifyChannel(10223): onNativeInvoke 2
+
+I/NotifyChannel(10223): completion buffer update {duration=285.96, tcpSpeed=3325089, isPlaying=true, outputFps=25.0, currentPosition=1.558, width=1280, degree=0, height=720} 10
+
+I/IJKMEDIA(10223): Opening 'https://media001.geekbang.org/f433fd1ce5e84d27b1101f0dad72a126/de563bb4aba94b5f95f448b33be4dd9f-b64cf280cabc4d9c202a62095ae10e95-sd-00005.ts' for reading
+
+I/tv.danmaku.ijk.media.player.IjkMediaPlayer(10223): onNativeInvoke 1
+
+I/NotifyChannel(10223): onNativeInvoke 1
+
+I/IJKMEDIA(10223): Hit DNS cache hostname = media001.geekbang.org
+
+I/tv.danmaku.ijk.media.player.IjkMediaPlayer(10223): onNativeInvoke 131073
+
+I/NotifyChannel(10223): onNativeInvoke 131073
+
+I/tv.danmaku.ijk.media.player.IjkMediaPlayer(10223): onNativeInvoke 131074
+
+I/NotifyChannel(10223): onNativeInvoke 131074
+
+I/tv.danmaku.ijk.media.player.IjkMediaPlayer(10223): onNativeInvoke 2
+
+I/NotifyChannel(10223): onNativeInvoke 2
+
+D/libEGL  (10223): eglInitialize: enter
+
+D/libEGL  (10223): eglInitialize: exit(res=1)
+
+I/NotifyChannel(10223): completion buffer update {duration=285.96, tcpSpeed=3523889, isPlaying=true, outputFps=24.242424, currentPosition=2.072, width=1280, degree=0, height=720} 14
+
+I/IJKMEDIA(10223): Opening 'https://media001.geekbang.org/f433fd1ce5e84d27b1101f0dad72a126/de563bb4aba94b5f95f448b33be4dd9f-b64cf280cabc4d9c202a62095ae10e95-sd-00006.ts' for reading
+
+I/tv.danmaku.ijk.media.player.IjkMediaPlayer(10223): onNativeInvoke 1
+
+I/NotifyChannel(10223): onNativeInvoke 1
+
+I/IJKMEDIA(10223): Hit DNS cache hostname = media001.geekbang.org
+
+I/tv.danmaku.ijk.media.player.IjkMediaPlayer(10223): onNativeInvoke 131073
+
+I/NotifyChannel(10223): onNativeInvoke 131073
+
+I/tv.danmaku.ijk.media.player.IjkMediaPlayer(10223): onNativeInvoke 131074
+
+I/NotifyChannel(10223): onNativeInvoke 131074
+
+I/tv.danmaku.ijk.media.player.IjkMediaPlayer(10223): onNativeInvoke 2
+
+I/NotifyChannel(10223): onNativeInvoke 2
+
+D/IJKMEDIA(10223): IjkMediaPlayer_native_finalize
+
+D/IJKMEDIA(10223): IjkMediaPlayer_release
+
+W/System  (10223): A resource failed to call release.
+
+I/flutter (10223): (i)Ijk:IjkMediaControllerMixin detach [GlobalKey#c70eb]
+
+D/IJKMEDIA(10223): IjkMediaPlayer_native_profileBegin
+
+W/IJKMEDIA(10223): monstartup already called
+
+D/IJKMEDIA(10223): IjkMediaPlayer_native_profileBegin
+
+W/IJKMEDIA(10223): monstartup already called
+
+D/IJKMEDIA(10223): ijkmp_stop()
+
+D/IJKMEDIA(10223): ijkmp_stop()=0
+
+D/IJKMEDIA(10223): IjkMediaPlayer_release
+
+D/IJKMEDIA(10223): ijkmp_set_android_surface(surface=0x0)
+
+D/IJKMEDIA(10223): ffpipeline_set_surface()
+
+D/IJKMEDIA(10223): ijkmp_set_android_surface(surface=0x0)=void
+
+D/IJKMEDIA(10223): ijkmp_shutdown_l()
+
+D/IJKMEDIA(10223): message_loop exit
+
+I/IJKMEDIA(10223): SDL_JNI_DetachThreadEnv: [10641]
+
+I/IJKMEDIA(10223): convert image convert_frame_count = 0
+
+I/IJKMEDIA(10223): SDL_JNI_DetachThreadEnv: [10651]
+
+E/IJKMEDIA(10223): Stream ends prematurely at 441603, should be 2042056
+
+I/IJKMEDIA(10223): SDL_JNI_DetachThreadEnv: [10643]
+
+I/IJKMEDIA(10223): SDL_JNI_DetachThreadEnv: [10642]
+
+E/IJKMEDIA(10223): SDL_Overlay(ffmpeg): overlay_free_l(0x6ff5a7e760)
+
+E/IJKMEDIA(10223): SDL_Overlay(ffmpeg): overlay_free_l(0x6ff5a7e7d0)
+
+E/IJKMEDIA(10223): SDL_Overlay(ffmpeg): overlay_free_l(0x6ff5a7e840)
+
+D/IJKMEDIA(10223): ijkmp_shutdown_l()=void
+
+D/IJKMEDIA(10223): ijkmp_dec_ref(): ref=0
+
+D/IJKMEDIA(10223): ijkmp_shutdown_l()
+
+D/IJKMEDIA(10223): ijkmp_shutdown_l()=void
+
+D/IJKMEDIA(10223): IjkMediaPlayer_native_finalize
+
+D/IJKMEDIA(10223): IjkMediaPlayer_release
+
+W/System  (10223): A resource failed to call release.
+