项目要求:实现Android端P2P视频点播软件
转载请注明出处: http://blog.csdn.net/echoaiya/article/details/44196771
方案:Libtorrent + VLC
说明:
(1)Tribler-streaming JAVA语言,是国外某大学学生团队实现的android平台P2P视频点播系统,其采用的是VLC+libtorrent,文档说明中提到实现了P2P视频点播,不过提供的代码验证不通过,且未提供JNI代码,libtorrent.so库中有些底层方法不知是如何实现的。其JAVA层修改片优先级以实现播放的方法可以参考一下。底层代码在com.softwarrior.libtorrent.LibTorrent.java,播放代码在org.videolan.vlc.gui.video.VideoPlayerActivity。
(2)RuTracker-2.6.5.5 JAVA语言,网上最新版本APK是RuTracker-2.9.6.5,只找到2.6.5.5的代码,它与俄罗斯种子网站RuTracker应该是一家。RuTracker-2.6.5.5主要作用是从几个种子网站搜索种子并下载,经测试其代码可用,且最重要的是提供了libtorrent的JNI编译代码(本人尝试多次ndk编译libtorrent-1.0.2均失败,发现不能直接编译,需要修改libtorrent-1.0.2,如何修改就不得而知了)。不过该libtorrent版本较低,要换新版本可能会比较麻烦。
(3)frostwire-android JAVA语言其实现了类似于RuTracker-2.6.5.5的功能,UI更加漂亮,搜索的种子网站也较多。其依赖于frost-wire-jlibtorrent和frostwire-common两个JAVA库。
(4)frostwire-jlibtorrent JAVA语言,利用swig将C++写的libtorrent-1.0.2转换为Java,且ndk编译生成jlibtorrent.so库,方便调用libtorrent底层实现。找到此代码非常开心,以为有它万事大吉,谁知frostwire作者在写libtorrent.i时,忽略了好些libtorrent的类和方法,更郁闷的是,按照作者的方法死活编译不过ndk,无法自己生成jlibtorrent.so库,浪费了我半个月的时间,纠结得要死,最后还是无奈放弃。
(5)libbtstream C++语言,网上找到的一个据说实现了libtorrent顺序下载片并播放的API库,代码由C++语言编写。原本打算将libbtstream转为JAVA,调用frostwire-jlibtorrent实现功能,无奈libbtstream所需的两个类torrent.cpp和torrent_plugin.cpp没有被编入frostwire-jlibtorrent,在重新编译forstwire-jlibtorrent未果的情况下,只能放弃该方案。
总结:鉴于frostwire-jlibtorrent无法重现编译,无奈只能放弃。所幸按照tribler-streaming作者介绍,成功编译了RuTracker-2.6.5.5,得出如下方案。
方案一 根据Rutracker-2.6.5.5自己写tribler-streaming的libtorrent.cpp文件。仔细阅读发现tribler-streaming调用的底层方法有一半是RuTracker原有的,剩下的一半是新加入的方法。这些新加入的方法有些是libtorrent本身支持的,比如SetPiecePriorities(),且有些新加入的方法没有被调用,可以不写。综上,自己写libtorrent.cpp非常可行。
方案二 NDK编译btstream,Java层调用btstream的方法实现播放。将btstream代码放入Rutracker-2.6.5.5/jni目录下,为libtorrent.cpp添加GetBTStream()方法,在RuTracker-2.6.5.5的Java层编写方法调用该JNI代码,验证是否能够成功播放。
无论如何,首先要做的是编译RuTracker-2.6.5.5。
1、NDK编译RuTracker-2.6.5.5
按照tribler-streaming说明,编译RuTracker-6.2.5.5,生成libtorrent.so,替换原libs下libtorrent.so文件,验证功能OK,编译成功。编译步骤如下:
Libtorrent
编译BOOST库
下载Boost-for-android代码:
$:git clone https://github.com/MysticTreeGames/Boost-for-Android
进入路径:
$:cd git/Boost-for-Android
执行如下命令:
$:./build-android.sh
设置环境变量
执行如下命令:
$:
sudo vi /etc/environment
$:
AndroidNDKRoot=path/to/android-ndk-r9 32
$:
NDK ROOT=path/to/android-ndk-r9 32
$:
NDK MODULE PATH=path/to/Boost-for-Android
$:
BOOST ROOT=path/to/boost
$:
BOOST BUILD PATH=path/to/boost/tools/build/v2
add the following to PATH:
path/to/Boost-for-Android
编译RUTRACKER
下载 RuTracker 源码:
svn checkout http://softwarrior.googlecode.com/svn/tags/RutrackerDownloader/2.6.5.5/
extract all from the JNI folder.
修改jni/libtorrent目录下, adaptle.cpp:
Changeifdef NR fallocateto:ifndef NR fallocate
将先前编译的Boost库拷贝到jni/libboost目录下,记得修改Android.mk,保证链接正确的boost库
在 Application.mk中添加:
APP ABI := armeabi armeabiv7a
命令行编译LIBTORRENT :
进入RuTracker 目录:
cd path/to/RuTracker
执行如下命令:
ndk-build clean
ndk-build
等侯片刻,在libs会生成armeabi和armeabi-v7a版本的libtorrent.so,编译成功
转载请注明出处: http://blog.csdn.net/echoaiya/article/details/44196771