我正在尝试在我的Android手机上播放来自Raspberry 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/端口的普通字符串。
当我将其运行在模拟器中时,SRC指向我的本地Raspberry Pi @端口8090,它开始按预期显示流。
我什至发现我可以使用IP/端口字符串启动本机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
我的解决方案:
使用另一种流格式。
我现在使用HLS,它要求您在Raspberry Pi上设置HTTP服务器。
请注意,HLS将在Android和iPhone上使用,但在Windows PC浏览器上不使用(Microsoft Edge除外)。
我的结论:
以前使用的格式不与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需要一些启动时间,然后再通过应用程序连接到流或失败。