Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1488563
  • 博文数量: 267
  • 博客积分: 3010
  • 博客等级: 少校
  • 技术积分: 3089
  • 用 户 组: 普通用户
  • 注册时间: 2011-06-05 17:09
个人简介

尊天命,尽人事

文章分类

全部博文(267)

文章存档

2017年(6)

2015年(4)

2014年(27)

2013年(52)

2012年(59)

2011年(120)

分类: LINUX

2013-08-11 18:20:50

在开源的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就起来了,再运行,程序就起来了。

阅读(4824) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~