想要创建应用程序,从 android 中的 url 流式传输

Posted

技术标签:

【中文标题】想要创建应用程序,从 android 中的 url 流式传输【英文标题】:Want to create app, to stream from a url in android 【发布时间】:2017-03-12 22:52:33 【问题描述】:

我从任何人那里得到一个网址,格式如下:

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

【问题讨论】:

你能从你的 logcat 中发布一些日志吗?通常当媒体控制器发生故障时,它会打印几个警告或错误日志。最坏的情况,您可以在网络浏览器中打开链接 Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse("ak-rt01.mni.thm.de:3000/#/playlist/…)); startActivity(i); @oathkeeper 我更新了帖子。你能认出什么吗? 我已经添加了一个答案来回应您的询问。媒体控制器点击了期望视频的 URL,但点击了一些 html 页面。如果您还有任何疑问,请告诉我... @oathkeeper 感谢您快速而翔实的回答。我将测试所有三种备选方案的可行性。你太棒了。我为这段代码浪费了 2 天时间。谢谢! (我会点击“有用的答案”,但我没有 15 名声望。) 当然,任何时候 :) 。如果你在其他地方卡住了,请告诉我。使用此 URL techslides.com/demos/sample-videos/small.mp4 测试您的代码。它包含一个有效的视频 URL。 【参考方案1】:

您的媒体控制器遇到的问题是它无法从 URL 中找到有效的视频文件。 VideoView 的 Video 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

在安卓设备网络浏览器中打开给定的链接。

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_  
        android:layout_ />  

WebView webView= (WebView) findViewById(R.id.webView);

webView.loadUrl("http://ak-rt01.mni.thm.de:3000/#/playlist/57b03967e4da719c28d9fe2d");

【讨论】:

@Tuba Ylm,如果这个答案对你有帮助,请点赞并将这个答案标记为正确:) :) 感谢您的回答,它也帮助了我!! 当然...随时。回复晚了非常抱歉。尝试实施其他用户建议的解决方案。 :)【参考方案2】:

短版:

而不是...

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。但它不起作用......”

您的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 部分替换为m2m3m4m5

(3) : Playing it Android... 这是我建议的棘手部分,因为我更多地使用 Flash 来制作我的 Android .apk 应用程序(实际上我在这里是因为你标记为 Flash)。您需要找到正确的 Android SDK 代码示例来播放m3u8 文件。

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

作为起点,试试这个可能的solution240p 的代码如下所示:

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 URL。

【讨论】:

请使用我的答案旁边的 图标将此标记为已解决。谢谢

以上是关于想要创建应用程序,从 android 中的 url 流式传输的主要内容,如果未能解决你的问题,请参考以下文章

Android Google Maps v2 从资产中的图像加载 OverlayTile

如何从 Android 上的 URL 页面获取预览拇指?

Android TV 从 URL 播放视频

从 url/http 下载并打开图片 [Android Xamarin App]

新手为Android创建URL应用程序的快捷方式[重复]

如何从 Android 中的电子邮件 URL 打开已安装的应用程序? [复制]