最近一阵收到一只Chromecast v2于是开始研究一些网络推流的工具,这时候我发现手机上使用的BubbleUPnP软件不但可以推流给Chromecast,借助BubbleUPnPServer还可以实现转码推流。
BubbleUPnPServer转码推流的实质是借助FFMPEG对视频流进行预处理。当你有一台性能还不赖的NAS的时候,你就可以使用它转码并且输出兼容性更好的视频流推送给Chromcast。
其作用即Twonkyserver文档中提到的Transcoding Engines。同时,BubbleUPnPServer也是可以配合Twonky使用的。
Contents
安装BubbleUPnPServer
安装的宿主系统使用OMV3.0(即Debian8.x系统)
由于BubbleUPnPServer的官方支持软件包列表中暂时没有Debian系统,因此这里采用手动安装。
注:此处使用的,命令都运行在root权限下。
Step 1:
安装JAVA
BubbleUPnPServer是一个基于JAVA的跨平台项目,因此所有平台都公用一个BubbleUPnPServer-distrib.zip。它的安装要求是提供oracle JAVA 7或者更高版本。在这里我选择安装JAVA 8。
在Debian中的安装方法如下:
echo "deb http://ppa.launchpad.net/webupd8team/java/ubuntu xenial main" | tee /etc/apt/sources.list.d/webupd8team-java.list echo "deb-src http://ppa.launchpad.net/webupd8team/java/ubuntu xenial main" | tee -a /etc/apt/sources.list.d/webupd8team-java.list apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys EEA14886 apt-get update apt-get install oracle-java8-installer
Step 2:
安装FFmpeg
BubbleUPnPServer的转码依赖于FFmpeg。我们首先下载一些FFmpeg的编码解码lib,并且编译一个最新的FFmpeg
1.安装相关lib库
apt-get update && apt-get upgrade -y apt-get -y install autoconf automake build-essential libass-dev libgpac-dev libssl-dev libtool openssl pkg-config texi2html zlib1g-dev libmp3lame-dev libx264-dev yasm
2.安装FDKaac
FDKaac是一个不错的开源编解码器(但不是自由软件),并且被Android使用。编译步骤如下:
mkdir ~/ffmpeg_sources cd ~/ffmpeg_sources wget -O fdk-aac.zip https://github.com/mstorsjo/fdk-aac/zipball/master unzip fdk-aac.zip cd mstorsjo-fdk-aac* autoreconf -fiv ./configure --prefix="$HOME/ffmpeg_build" --disable-shared make make install
3.编译FFmpeg
有了以上编译的几个lib库以后,就可以正式编译FFmpeg了。根据需求我们需要下载源码,更新编译配置。
cd ~/ffmpeg_sources wget http://ffmpeg.org/releases/ffmpeg-snapshot.tar.bz2 tar xjvf ffmpeg-snapshot.tar.bz2 cd ffmpeg PKG_CONFIG_PATH="$HOME/ffmpeg_build/lib/pkgconfig" export PKG_CONFIG_PATH ./configure --prefix="$HOME/ffmpeg_build" --extra-cflags="-I$HOME/ffmpeg_build/include" \ --extra-ldflags="-L$HOME/ffmpeg_build/lib" --bindir="$HOME/bin" --extra-libs="-ldl" --enable-gpl \ --enable-libass --enable-openssl --enable-libfdk-aac --enable-libmp3lame --disable-ffserver --disable-ffplay \ --enable-libx264 --enable-nonfree make make install
此时我们可以在~/bin目录中找到编译好的ffmpeg、ffprobe
Step 3:
部署BubbleUPnPServer
BubbleUPnPServer的部署主要是文件的拷贝并不涉及其他的编译。
cd /usr/local mkdir BubbleUPnPServer cd BubbleUPnPServer/ wget http://www.bubblesoftapps.com/bubbleupnpserver/BubbleUPnPServer-distrib.zip unzip BubbleUPnPServer-distrib.zip && rm BubbleUPnPServer-distrib.zip chmod 755 launch.sh cp ~/bin/ffmpeg ffmpeg cp ~/bin/ffprobe ffprobe
首先做一下启动测试:
./launch.sh
如果正常输出log则部署成功,此时访问https://<SERVERADDR>:58051/就可以看到BubbleUPnPServer的WebUI。
设置自启动:
touch /etc/init.d/BubbleUPnPServer nano /etc/init.d/BubbleUPnPServer
粘贴以下内容:
#!/bin/bash ### BEGIN INIT INFO # Provides: BubbleServer # Required-Start: $remote_fs $syslog # Required-Stop: $remote_fs $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: BubbleUPnP Server Background Service Management # Description: Used to ensure BubbleUPnP starts/stops etc ### END INIT INFO DAEMON_PATH="/usr/local/BubbleUPnPServer" DAEMON="./launch.sh" DAEMONOPTS="" NAME=BubbleUPnPServer DESC="Runs BubbleUPnPServer" PIDFILE=/var/run/$NAME.pid SCRIPTNAME=/etc/init.d/$NAME case "$1" in start) printf "%-50s" "Starting $NAME..." cd $DAEMON_PATH PID=`$DAEMON $DAEMONOPTS > /dev/null 2>&1 & echo $!` #echo "Saving PID" $PID " to " $PIDFILE if [ -z $PID ]; then printf "%sn" "Fail" else echo $PID > $PIDFILE printf "%sn" "Ok" fi ;; status) printf "%-50s" "Checking $NAME..." if [ -f $PIDFILE ]; then PID=`cat $PIDFILE` if [ -z "`ps axf | grep ${PID} | grep -v grep`" ]; then printf "%sn" "Process dead but pidfile exists" else echo "Running" fi else printf "%sn" "Service not running" fi ;; stop) printf "%-50s" "Stopping $NAME" PID=`cat $PIDFILE` cd $DAEMON_PATH if [ -f $PIDFILE ]; then kill -HUP $PID printf "%sn" "Ok" rm -f $PIDFILE else printf "%sn" "pidfile not found" fi ;; restart) $0 stop $0 start ;; *) echo "Usage: $0 {status|start|stop|restart}" exit 1 esac
保存文档,并更新自启动管理。
chmod 755 /etc/init.d/BubbleUPnPServer update-rc.d BubbleUPnPServer defaults
配置BubbleUPnPServer
BubbleUPnPServer的配置项目并不多,但是其Android客户端的功能却着实不少。
对于WebUI方面我这次主要目的是给Chromecast推流做转码,那么暂且跳过一段常规配置(Proxy,access等)
Chromecast的转码播放
在正确安装完BubbleUPnPServer以及ffmpeg/ffprobe之后,一种方案是通过Android BubbleUPnP来推流。通常情况下这里不需要手动输入任何链接设定。当Android BubbleUPnP被检测到以后,从Settings > Chromecast即可设置各项配置。
Current transcoding method会显示现在使用的Server的ip地址;
Transconding settings中可以调节各项参数:
是否启用转码
转码速度预设(Ultra fast最快,效果最差,Very slow资源占用最大,效果最好)
最大视频码率(超过这项值视频就会被转码,当回放有卡顿就需要减小这个值,开启转码)
强制转码开关
是否转码多声道音频
是否转码AC-3音频(默认转码)
是否解压出内嵌字幕
根据自己BubbleUPnPServer的性能高低可以设定不同的配置方案。
将 Google Cast 设备转换成一个音频 DLNA 或者 OpenHome 渲染器
在MediaRanders页面中可以勾选将Chromecast转换成DLNA音频设备,或者OpenHome设备,但是禁止同时设定为OpenHome以及DLNA设备,防止两套程序互相抢夺控制权。
使用这个功能我们可以在不开启Android BubbleUPnP的时候继续给Chromecast推流。
BubbleUPnP Server可以比较方便的解决一些Chromecast无法完成的解码工作,减轻负担。
参考文档:
http://bubblesoftapps.com/bubbleupnpserver/index.html
https://www.raspberrypi.org/forums/viewtopic.php?f=38&t=73464
http://wiki.tuxnet24.de/display/MAIN/BubbleUPnPServer+auf+Debian+Wheezy+installieren