我试图在我的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
答案 0 :(得分:1)
使用其他流格式。
我现在使用HLS,它要求你在覆盆子pi上设置像nginx这样的http服务器。
请注意,HLS适用于Android和iphone,但不适用于Windows PC浏览器(微软边缘除外)。
之前使用的格式不是,或者至少不再与android兼容。但它以某种方式在模拟器中工作..
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.parse("http://192.168.2.189/hls/stream.m3u8"),"video/*");
startActivity(intent);
在您的网站路径中创建一个新文件夹。这不是必要的,但是要保持流网段与其他网页内容分开。
接下来创建一个这样的脚本来启动你的流:
#!/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需要一些启动时间,否则它将失败。