在开源的DLNA框架实现中, uShare 应该是实现最好, 且用得做多的开源项目了。
uShare 下载地址为 :
下载后解压使用 tar -jxvf ushare-1.1a.tar.bz2 即可。
uShare 是用C语言实现,在 下运行的一个开源项目 通过UPNP协议,把媒体文件共享给其他的设备。
uShare 只依赖libUpnp库, 下载地址为
如果你要让 uShare 支持 dlna, 则还需要libdlna库的支持,下载地址为
而libdlna库有依赖 ffmpeg中的视频编解码模块。
要让uShare支持dlna, 生成Makefile文件时,需要下面这样的参数
./configure --enable-dlna
uShare支持的文件格式如下 :
-
Video files: asf, avi, dv, divx, wmv, mjpg,
mjpeg, mpeg, mpg, mpe, mp2p, vob, mp2t, m1v, m2v, m4v, m4p, mp4ps, ts,
ogm, mkv, rmvb, mov, qt, hdmov
-
Audio files: aac, ac3, aif, aiff, at3p, au, snd, dts, rmi, mp1, mp2, mp3, mp4, mpa, ogg, wav, pcm, lpcm, l16, wma, mka, ra, rm, ram, flac
-
Images files: bmp, ico, gif, jpeg, jpg, jpe, pcd, png, pnm, ppm, qti, qtf, qtif, tif, tiff
-
Playlist files: pls, m3u, asx
-
Subtitle files: dks, idx, mpl, pjs, psb, scr, srt, ssa, stl, sub, tts, vsf, zeg
-
Various text files: bup, ifo
下面是一些与 UPnP 相关的软件:
-
: 使用了FUSE来映射一个目录的内容到 UPnP A/V Media Servers.
-
: 一个基于uShare实现的 Media Server.
-
: DLNA的框架实现.
-
: Linux下的媒体分发软件,使用了djmount和UPnP.
编译uShare时,libupnp的版本不能太高,太高了, 版本不兼容,无法编译uShare, libupnp的版本选择1.4.2 或者1.4.3即可,编译会很顺利,
否则编译会出现很多奇怪的错误。
编译:
ushare是网络上一个DMS的源代码,下面要交叉编译到目标平台上:
编译环境:
编译器:arm-hisiv200-linux-gcc
主机:ubuntu 10.4
源码包:
ffmpeg-0.11.tar.bz2
libdlna-0.2.4.tar.bz2
libupnp-1.6.17.tar.bz2
ushare-1.1a.tar.bz2
依赖关系:
ushare 依赖libdlna,libupnp
libdlna依赖ffmpeg中的libavformat,libavcodec,libavutil
约定目录
WORK_DIR=$PWD
TARGET_INC="$WORK_DIR"/inc
TARGET_LIBS="$WORK_DIR"/lib
TARGET_BIN="$WORK_DIR"/bin
TARGET_SBIN="$WORK_DIR"/sbin
1.交叉编译upnp
./configure \
--prefix="$WORK_DIR" \
--bindir="$TARGET_BIN" \
--sbindir="$TARGET_BIN" \
--libexecdir="$TARGET_BIN" \
--libdir="$TARGET_LIBS" \
--includedir="$TARGET_INC" \
--host="$CROSS_COMPILE" \
--enable-debug \
--enable-shared \
--enable-static
make
make install
2.交叉编译ffmpeg
./configure \
--prefix="$WORK_DIR" \
--bindir="$TARGET_BIN" \
--libdir="$TARGET_LIBS" \
--incdir="$TARGET_INC" \
--enable-small \
--enable-shared \
--disable-doc \
--disable-yasm \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffserver \
--disable-ffprobe \
--disable-avdevice \
--disable-swresample \
--disable-swscale \
--disable-postproc \
--disable-avfilter \
--disable-w32threads \
--disable-os2threads \
--cross-prefix="$CROSS_COMPILE-" \
--target-os=linux \
--arch=arm
make
make install
3.交叉编译libdlna
修改目录下的configure文件:
(1)修改
639 if [ -n "$ffmpegdir" ]; then
640 check_cflags -I$ffmpegdir
641 check_ldflags -L$ffmpegdir
642 fi
644 echolog "Checking for libavformat ..."
645 check_lib libavformat/avformat.h av_register_all -lavformat || die "Error, can't find libavformat !"
646 echolog "Checking for libavcodec ..."
647 check_lib libavcodec/avcodec.h avcodec_register_all -lavcodec || die "Error, can't find libavcodec !"
为:
639 if [ -n "$ffmpegdir" ]; then
640 check_cflags -I$ffmpegdir/inc
641 check_ldflags -L$ffmpegdir/lib
642 fi
644 echolog "Checking for libavcodec ..."
645 check_lib libavcodec/avcodec.h avcodec_register_all -lavcodec -lavutil || die "Error, can't find libavcodec !"
646 echolog "Checking for libavformat ..."
647 check_lib libavformat/avformat.h av_register_all -lavformat || die "Error, can't find libavformat !"
(2)修改:
662 VERSION=`$TMPE`
为:
662 VERSION=“0.2.4”
./configure \
--prefix="$WORK_DIR" \
--libdir="$TARGET_LIBS" \
--includedir="$TARGET_INC" \
--enable-shared \
--with-ffmpeg-dir="$WORK_DIR" \
--disable-developer \
--enable-debug \
--cross-prefix="$CROSS_COMPILE-" \
--cross-compile
make
make install
4.交叉编译ushare
(1)修改configure:
将TARGET_LIBS目录下的pkgconfig目录复制到/usr/local/lib目录下,因为ushare的configure要检查版本号,编译完了记得删除它。
662 check_lib dlna.h dlna_register_all_media_profiles -ldlna|| die "Error, can't find libdlna (install it or use --disable-dlna) !"
为
662 check_lib dlna.h dlna_register_all_media_profiles -ldlna -lavcodec -lavutil -lavformat || die "Error, can't find libdlna (install it or use --disable-dlna) !"
(2)vi src/ushare.c
191 ip = request->CtrlPtIPAddr.s_addr;
TO 191 ip = ((struct in_addr*)&request->CtrlPtIPAddr)->s_addr;
647 check_lib upnp/upnp.h UpnpSetMaxContentLength -lupnp || die "Error, can't find libupnp !"
TO 647 check_lib upnp/upnp.h UpnpSetMaxContentLength -lupnp -lixml || die "Error, can't find libupnp !"
./configure \
--prefix="$WORK_DIR" \
--bindir="$TARGET_BIN" \
--log=yes \
--localedir="$WORK_DIR" \
--enable-dlna \
--with-libupnp-dir="$WORK_DIR" \
--with-libdlna-dir="$WORK_DIR" \
--enable-debug \
--cross-prefix="$CROSS_COMPILE-" \
--cross-compile
cp config.h src/
make
make install
===============================================================
将程序放到开发板上运行,一直报错,UpnpInit函数返回-203
发现是绑定错误,定位错误到:
miniserver.c:get_miniserver_sockets:
/* Bind to local socket. */
memset(&stop_sockaddr, 0, sizeof (stop_sockaddr));
stop_sockaddr.sin_family = (sa_family_t)AF_INET;
stop_sockaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
ret = bind(miniServerStopSock, (struct sockaddr *)&stop_sockaddr,
sizeof(stop_sockaddr));
怀疑是开发板不支持127.0.0.1地址,在开发板上ping一下127.0.0.1,果然如此
在开发板上运行ifconfig lo 127.0.0.1就起来了,再运行,程序就起来了。