我从任何人处获得了以下格式的 URL:
http://ak...
有一个用flashplayer播放的视频。
我想从 Android 应用程序流式传输此视频,我尝试使用 videoview 和媒体控制器。但它不起作用,我不知道该怎么办了。
你能给我一些关键词来解决这个问题吗,这样我就可以在网上搜索一下。
try {
String videoUrl= "http://ak;
// Start the MediaController
MediaController mediacontroller = new MediaController(
LiveStreamActivity.this);
mediacontroller.setAnchorView(videoview);
// Get the URL from String VideoURL
Uri video = Uri.parse(videoUrl);
videoview.setMediaController(mediacontroller);
videoview.setVideoURI(video);
startTimer();
} catch (Exception e) {
e.printStackTrace();
}
videoview.requestFocus();
videoview.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
// Close the progress bar and play the video
@Override
public void onPrepared(MediaPlayer mp) {
videoview.start();
checkBuffering();
}
});
这是我的代码,logcat 是:
I/MediaPlayer: path is null
D/MediaPlayer: setDataSource IOException happend :
java.io.FileNotFoundException: No content provider: http://ak-rt01.mni.thm.de:3000/#/playlist/57b03967e4da719c28d9fe2d
at android.content.ContentResolver.openTypedAssetFileDescriptor(ContentResolver.java:1052)
at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:907)
at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:834)
at android.media.MediaPlayer.setDataSource(MediaPlayer.java:987)
at android.widget.VideoView.openVideo(VideoView.java:337)
at android.widget.VideoView.access$2100(VideoView.java:71)
at android.widget.VideoView$7.surfaceCreated(VideoView.java:617)
at android.view.SurfaceView.updateWindow(SurfaceView.java:601)
at android.view.SurfaceView.access$000(SurfaceView.java:94)
at android.view.SurfaceView$3.onPreDraw(SurfaceView.java:183)
at android.view.ViewTreeObserver.dispatchOnPreDraw(ViewTreeObserver.java:879)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2129)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1234)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6465)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:803)
at android.view.Choreographer.doCallbacks(Choreographer.java:603)
at android.view.Choreographer.doFrame(Choreographer.java:573)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:789)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:157)
at android.app.ActivityThread.main(ActivityThread.java:5356)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
at dalvik.system.NativeStart.main(Native Method)
D/MediaPlayer: Couldn't open file on client side, trying server side
V/MediaPlayer: setVideoSurfaceTexture
V/MediaPlayer-JNI: setAudioStreamType: 3
V/MediaPlayer: MediaPlayer::setAudioStreamType
V/MediaPlayer: setVideoSurfaceTexture
V/MediaPlayer: prepareAsync
D/ProgressBar: setProgressDrawable drawableHeight = 48
D/AbsSeekBar: AbsSeekBar Constructor: misSeebarAnimationAvailable = true
V/MediaPlayer: message received msg=100, ext1=1, ext2=-1004
E/MediaPlayer: error (1, -1004)
V/MediaPlayer: callback application
V/MediaPlayer: back from callback
E/MediaPlayer: Error (1,-1004)
D/VideoView: Error: 1,-1004
您的媒体控制器遇到的问题是它无法从 URL 找到有效的视频文件。 VideoView 的视频 URI 通常应采用以下格式 http://dummyWebSite/dummy/randomFile.mp4 或 http://blah/blah/File.avi 。请注意,此处给出了服务器上上传的 randomFile.mp4 视频文件的路径。
出于测试目的,您可以使用此 URL 并尝试使用相同的代码,将您的 url 替换为此(带有 mp4 文件的有效 URL)http://techslides.com/demos/sample-videos/small.mp4
那么有什么替代方案呢?
替代方案1(最佳解决方案)
将您的视频 mp4、mov 或 avi 上传到文件服务器上,然后在文件服务器上点击视频的 url。
替代方案2
在 Android 设备网络浏览器中打开给定的链接。
Intent intent = new Intent(Intent.ACTION_VIEW,
Uri.parse("http://ak-rt01.mni.thm.de:3000/#/playlist/57b03967e4da719c28d9fe2d"));
startActivity(intent);
替代方案3
在android WebView
中打开链接<WebView
android:id="@+id/webView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
WebView webView= (WebView) findViewById(R.id.webView);
webView.loadUrl("http://ak-rt01.mni.thm.de:3000/#/playlist/57b03967e4da719c28d9fe2d");
简短版本:
而不是...
String videoUrl= "http://ak-rt01.mni.thm.de:3000/#/playlist/57b03967e4da719c28d9fe2d";
尝试使用...
String videoUrl= "http://ak-rt01.mni.thm.de:3000/storage/playliststorage/57b03967e4da719c28d9fe2d/mainpanel/m1.m3u8";
长版:
“我想从 Android 应用程序流式传输此视频,我用
和videoview
进行了尝试。但它不起作用......”mediacontroller
您的
videoUrl
(http://ak-rt01.mni.thm.de:3000/#/playlist/57b03967e4da719c28d9fe2d) 实际上正在访问 .m3u8
播放列表文件。此列表包含不同视频分辨率的流,您必须加载相关分辨率自己的 .m3u8
才能获得 .ts
视频文件的播放列表。
所以尝试以下方法:
(1) : 将
streams.m3u8
加载为文本(稍后可以使用String函数提取相关流链接)
http://ak-rt01.mni.thm.de:3000/storage/playliststorage/57b03967e4da719c28d9fe2d/mainpanel/streams.m3u8
它看起来像这样:
#EXTM3U
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=720896,RESOLUTION=426x240
m1.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1048576,RESOLUTION=640x360
m2.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1376256,RESOLUTION=853x480
m3.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=2031616,RESOLUTION=1024x576
m4.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=2686976,RESOLUTION=1280x720
m5.m3u8
所以从上面的文字我们可以推断出240p视频链接到
m1.m3u8
,或者480p视频链接到m3.m3u8
等等...
(2) : 假设您想播放 240p (426 x 240),这将是
m1.m3u8
所以链接是:
http://ak-rt01.mni.thm.de:3000/storage/playliststorage/57b03967e4da719c28d9fe2d/mainpanel/m1.m3u8
对于任何其他流,只需将上述链接的
m1
部分替换为 m2
、m3
、m4
或 m5
。
(3):玩Android...这是我建议的棘手部分,因为我更多地使用Flash来制作我的Android
.apk
应用程序(实际上我在这里是因为你标记了Flash)。您需要找到正确的 Android SDK 代码示例来播放 m3u8
文件。
您需要研究:如何在 Android SDK 中播放 m3u8 文件
作为起点,尝试这个可能的解决方案。带有 240p 的代码看起来像:
VideoView videoview = (VideoView)findViewById(R.id.myvideoview);
videoview.setMediaController(new MediaController(this));
videoview.setVideoURI(Uri.parse("http://ak-rt01.mni.thm.de:3000/storage/playliststorage/57b03967e4da719c28d9fe2d/mainpanel/m1.m3u8"));
videoview.requestFocus();
videoview.setOnPreparedListener(new OnPreparedListener() {
public void onPrepared(MediaPlayer mp) {
mp.start();
}
});
另一种可能的解决方案:链接1。我只能告诉您,Android 可以处理
.ts
视频文件,并且会接受有效的 m3u8
URL。