Android VideoView在模拟器上播放流,而不是在真实设备上播放?

时间:2016-12-23 17:28:47

标签: android video stream

我试图在我的Android手机上播放来自我的覆盆子pi的流。 我找到了在这样的视频中播放此流的代码:

private void playStream(String src){
 Uri UriSrc = Uri.parse(src);
    if(UriSrc == null){
     Toast.makeText(MainActivity.this, 
      "UriSrc == null", Toast.LENGTH_LONG).show();
    }else{
     streamView.setVideoURI(UriSrc);
        mediaController = new MediaController(this);
        streamView.setMediaController(mediaController);
        streamView.start();

        Toast.makeText(MainActivity.this, 
         "Connect: " + src, 
         Toast.LENGTH_LONG).show();
    }
}

其中src是带有ip / port的普通字符串。

当我在模拟器中运行它时,src指向我的本地raspberry pi @ port 8090,它开始按预期显示流。

我甚至发现我可以用ip / port字符串启动原生Android播放器,并且它会以全屏模式打开播放流。

Intent intent = new Intent(Intent.ACTION_VIEW );
intent.setDataAndType(Uri.parse("http://192.168.2.189:8090"), "video/*");
startActivity(intent);

然而,当我创建一个apk并在我的android 6设备上安装并运行它(A5 2016)时,第一个版本只会告诉我"抱歉,此视频无法播放",而第二个版本版本将无限加载,无需显示任何内容。

有人可以帮忙吗?我真的不想使用像vlc播放器这样的第三方应用程序来查看流,但是将它显示在我自己的应用程序或Android原生视频播放器中。

注意:流在我手机上的vlc应用程序中运行得非常好。

其他信息:

这是用于创建流的pi的命令:

raspivid -o - -t 0 -w 1280 -h 720 -fps 25 | cvlc stream:///dev/stdin --sout '#standard{access=http,mux=ts,dst=:8090}' :demux=h264

1 个答案:

答案 0 :(得分:1)

我的解决方案:

使用其他流格式。

我现在使用HLS,它要求你在覆盆子pi上设置像nginx这样的http服务器。

请注意,HLS适用于Android和iphone,但不适用于Windows PC浏览器(微软边缘除外)。

我的结论:

之前使用的格式不是,或者至少不再与android兼容。但它以某种方式在模拟器中工作..

在Android应用中使用的最终代码:

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.parse("http://192.168.2.189/hls/stream.m3u8"),"video/*");
startActivity(intent); 

raspberry pi步骤创建流数据:

在您的网站路径中创建一个新文件夹。这不是必要的,但是要保持流网段与其他网页内容分开。

接下来创建一个这样的脚本来启动你的流:

#!/bin/bash

set -x

base="/var/www/pisite/hls/"

raspivid -n -ih -t 0 -w 1280 -h 720 -fps 25 -o - | sudo ffmpeg -y \
-i - \
-c:v copy \
-map 0 \
-f ssegment \
-segment_time 1 \
-segment_format mpegts \
-segment_list "$base/stream.m3u8" \
-segment_list_size 10 \
-segment_wrap 20 \
-segment_list_flags +live \
-segment_list_type m3u8 \
"$base/%03d.ts"

这将创建android应用程序访问的stream.m3u8文件。 它只会使用10个段文件,因此可以无限期运行。

请注意,在您通过应用程序连接到流之前,您的pi需要一些启动时间,否则它将失败。