想要创建app,从android中的url流式传输

时间:2016-10-30 18:38:12

标签: android flash url video android-mediaplayer

我从这个格式的任何人那里获得了一个网址:

http://ak ...

有一个与flashplayer一起玩的视频。

我想从Android应用程序流式传输此视频,我尝试使用videoview和mediacontroller。但它不起作用,我不知道该怎么做。

你能给我一些解决问题的关键词,所以我可以在互联网上搜索它。

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

2 个答案:

答案 0 :(得分:0)

媒体控制器遇到的问题是无法从网址中找到有效的视频文件。 VideoView的视频URI通常采用此格式http://dummyWebSite/dummy/randomFile.mp4http://blah/blah/File.avi。请注意,此处提供了上传到服务器上的randomFile.mp4视频文件的路径。

出于测试目的,您可以使用此网址并尝试使用相同的代码替换此网址(带有mp4文件的有效网址)http://techslides.com/demos/sample-videos/small.mp4

那么可能有什么替代方案呢?

替代方案1(最佳解决方案)

将您的视频mp4,mov或avi上传到文件服务器上,然后点击文件服务器上的视频网址。

ALTERNATIVE 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");

答案 1 :(得分:0)

简短版本:

而不是......

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应用中流式传输此视频,并尝试使用videoviewmediacontroller。但它无效...”

您的videoUrlhttp://ak-rt01.mni.thm.de:3000/#/playlist/57b03967e4da719c28d9fe2d)实际上正在访问.m3u8播放列表文件。此列表包含不同视频分辨率的流,您必须为.m3u8视频文件的播放列表加载相关分辨率自己的.ts

请尝试以下方法:

(1):将streams.m3u8加载为文本(稍后可以使用字符串函数提取相关的流链接)

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

对于任何其他流,只需使用m1m2m3m4替换上述链接的m5部分。

(3):玩Android ...这对我来说是一个棘手的部分,因为我更多地使用Flash制作我的Android .apk应用程序(实际上我在这里因为你标记了Flash)。您需要找到正确的Android SDK代码考试才能播放m3u8文件。

您需要调查:如何在Android SDK中播放m3u8文件

作为一个起点尝试这可能solution。您的 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();
        }
    });

另一种可能的解决方案:link 1。我可以告诉您的是,Android可以处理.ts个视频文件并接受有效的m3u8网址。