DLNA-基于uShare的DMS移植和编译

时间:2020-12-01 06:34:47

***************************************************************************************************************************
作者:EasyWave                                                   时间:2014.04.13

类别:协议标准-DLNA简介                                  声明:转载,请保留链接

注意:如有错误,欢迎指正。这些是我学习的日志文章......

***************************************************************************************************************************

一:概述

        现在,Wi-Fi联盟已经开始同DLNA联盟(数字生活网络联盟)合作,将Wi-Fi Direct技术融合到DLNA技术里。一旦该技术稳定成型,应用于无线设备上,如智能手机、平板电脑里,它们就可以变身为多媒体服务器,来分享所收集的多媒体资料。这样在无线设备之间流媒体传递就不再需要无线路由器的连接了。而且,即使在不同的Wi-Fi网络上,你同样可以向你朋友的无线设备上直接共享音乐和视频等多媒体信息.

 

DLNA-基于uShare的DMS移植和编译

uShare是 最早实现 DLNA 支持的 UPnP 媒体服务器。uPnP是负责设备间的识别,DLNA依赖于uPnP,uShare是基于DLNA的媒体服务器。LibDLNA库,它只是完成对音视频和图像格式的识别与加载功能,并没有实现网络互连、网络传输、设备发现等功能。所以要演示DLNA的效果,就需要编译uShare。我这里采用的是下面这几个库,如下图所示:

DLNA-基于uShare的DMS移植和编译

这里我需要说一下,从一开始我使用的是libav0.66的版本来编译后来发现,这个版本太老了,所以后来选择了ffmepg-0.9.4的版本,下次将libav1.0的版本来编译应该也是不会有问题的,在编译的过程中,会出现很多的问题,下面会一一写出来...

二:uShare的移植和编译

1:ffmpeg0.9.4的编译

   如果要编译ffmpeg0.9.4的话,就需要进行配置,由于我这里是移植到ARM9下,因此需要配置,具体的配置如下所示:

#!/bin/bash

if [ "$1" == "" ]; then
	INSTALL_PATH=`pwd`/_install
else
	if [ -d $1 ]; then
		INSTALL_PATH=$1
	else
		exit 1
	fi
fi

if [ ! -d $INSTALL_PATH ]; then
	mkdir -p $INSTALL_PATH
fi

export LDFLAGS="-L$INSTALL_PATH/lib -L/usr/local/arm_linux_4.2/arm-none-linux-gnueabi/lib"
export CPPFLAGS="-I$INSTALL_PATH/include"
export LIBS="-ldl -lpthread"

if [ -f config.mak ]; then
	make distclean
fi

##  --enable-everything 

./configure --prefix=$INSTALL_PATH \
	  --cross-prefix=arm-linux- \
	  --enable-cross-compile \
	  --target-os=linux \
	  --arch=arm \
	  --enable-asm \
	  --disable-static \
	  --enable-shared \
	  --enable-gpl \
	  --enable-version3 \
	  --disable-nonfree  \
	  --disable-doc  \
	  --enable-avdevice \
	  --enable-avcodec \
	  --enable-avformat \
	  --enable-swscale \
	  --enable-postproc \
	  --enable-avfilter \
	  --enable-ffmpeg \
	  --disable-ffplay \
	  --disable-ffprobe \
	  --disable-ffserver \
	  --disable-os2threads \
	  --enable-pthreads \
	  --disable-w32threads \
	  --disable-x11grab \
	  --enable-network \
	  --disable-gray \
	  --enable-swscale-alpha \
	  --enable-fastdiv \
	  --enable-small \
	  --enable-aandct \
	  --enable-dct \
	  --enable-fft \
	  --enable-golomb \
	  --enable-lpc \
	  --enable-mdct \
	  --enable-rdft \
	  --enable-vdpau \
	  --disable-dxva2 \
	  --enable-runtime-cpudetect \
	  --enable-hardcoded-tables \
	  --enable-memalign-hack \
	  --enable-muxer=flv \
	  --enable-muxer=pcm_s16le \
	  --enable-demuxer=pcm_s16le \
	  --enable-protocol=rtp \
	  --disable-avisynth \
	  --disable-bzlib \
	  --disable-libopencore-amrnb \
	  --disable-libopencore-amrwb \
	  --disable-libdc1394 \
	  --disable-libdirac \
	  --disable-libfaac \
	  --disable-libgsm \
	  --disable-libmp3lame \
	  --disable-libnut \
	  --disable-libopenjpeg \
	  --disable-librtmp \
	  --disable-libschroedinger \
	  --disable-libspeex \
	  --disable-libtheora \
	  --disable-libvo-aacenc \
	  --disable-libvorbis \
	  --disable-libvpx \
	  --disable-libx264 \
	  --disable-libxvid \
	  --disable-mlib \
	  --disable-zlib \
	  --disable-altivec \
	  --disable-amd3dnow \
	  --disable-amd3dnowext \
	  --disable-mmx \
	  --disable-mmx2 \
	  --disable-sse \
	  --disable-ssse3 \
	  --disable-armv5te \
	  --disable-armv6 \
	  --disable-armv6t2 \
	  --disable-armvfp \
	  --disable-iwmmxt \
	  --disable-mmi \
	  --disable-neon \
	  --disable-vis \
	  --disable-yasm \
	  --enable-pic \
	  --disable-debug \
	  --enable-optimizations

if [ -f config.h ]; then
	sed -i 's/HAVE_TRUNC 0/HAVE_TRUNC 1/g' config.h
	sed -i 's/HAVE_TRUNCF 0/HAVE_TRUNCF 1/g' config.h
fi

if [ $? -eq 0 ]; then
        make 
        if [ $? -eq 0 ]; then
                make install
                exit 0
        fi
fi
exit 1


这里需要说明的是,下面这几条判断语句是一定要加的,否则会出现trunc和truncf的函数的错误,同时还需要修改ffmpeg0.9.4的两个文件,一个libavcodec目录下的amrwbdec.c文件,一个是libavutil目录下的eval.c,如果不改,会出现编译失败。具体修改如下:

A:修改HAVE_TRUNC和HAVE_TRUNCF

DLNA-基于uShare的DMS移植和编译

B:修改amrwbdec.c文件

DLNA-基于uShare的DMS移植和编译

 

C:修改eval.c文件

DLNA-基于uShare的DMS移植和编译

也就是说,需要将trunc和truncf函数加入到这两个文件中去,否则编译会出现问题而导致编译无法通过。

 

2:libDLNA0.2.4的编译

在编译和移植libDLNA之前,需要先修改configure文件,这是由于configure文件中的VERSION会有问题而导致编译失败,具体的修改如下:

DLNA-基于uShare的DMS移植和编译

选中部分的需要修改,默认是在X86的架构中,因此我这里将其修改到ARMV5版本下,这个可以不用改的...

DLNA-基于uShare的DMS移植和编译

选中部分的TMPEVERSION是我新增加的,请务必要修改,否则出现编译无法通过的问题..其配置如下:

#!/bin/bash

if [ "$1" == "" ]; then
	INSTALL_PATH=`pwd`/_install
else
	if [ -d $1 ]; then
		INSTALL_PATH=$1
	else
		exit 1
	fi
fi

if [ ! -d $INSTALL_PATH ]; then
	mkdir -p $INSTALL_PATH
fi

export LDFLAGS="-L$INSTALL_PATH/lib -lavcodec -lavformat -lavutil"
export CFLAGS="-I$INSTALL_PATH/include"

if [ -f config.h ]; then
	make distclean
fi

./configure --prefix=$INSTALL_PATH \
            --disable-static  \
            --enable-shared \
            --with-ffmpeg-dir=$INSTALL_PATH \
            --cross-prefix=arm-linux- \
            --cross-compile
 
if [ $? -eq 0 ]; then
        make 
        if [ $? -eq 0 ]; then
                make install
                exit 0
        fi
fi
exit 1


注意一定要在LDFLAGS中加入这几个选项:-lavcodec -lavformat -lavutil否则编译始终会出现,如下的错误:

Error, can't find libavformat !

Error, can't find libavcodec !

 

3:libupnp1.4.6的编译

libupnp 是一个便携、可移植的uPnp 的 C 语言开发包,UPnP是一种网络协议,允许设备自动搜寻和设定。家居数字化DLNA组织正是基于UPnP的。其配置如下:

#!/bin/bash

if [ "$1" == "" ]; then
	INSTALL_PATH=`pwd`/_install
else
	if [ -d $1 ]; then
		INSTALL_PATH=$1
	else
		exit 1
	fi
fi

if [ ! -d $INSTALL_PATH ]; then
	mkdir -p $INSTALL_PATH
fi

if [ -f config.log ]; then
	make distclean
fi

./configure --prefix=$INSTALL_PATH \
            --host=arm-none-linux-gnueabi \
	    --build=i486-linux-gnu \
	    --disable-option-checking \
	    --disable-debug \
	    --enable-client \
	    --enable-device \
	    --enable-webserver \
	    --enable-ssdp \
	    --enable-optssdp \
	    --enable-soap \
	    --enable-gena \
	    --enable-tools \
	    --disable-ipv6 \
	    --disable-unspecified_server \
	    --enable-dependency-tracking \
	    --disable-dependency-tracking \
	    --enable-shared=yes \
	    --enable-static=no \
	    --enable-fast-install=yes \
	    --disable-libtool-lock \
            --with-gnu-ld

 
if [ $? -eq 0 ]; then
        make 
        if [ $? -eq 0 ]; then
                make install
                exit 0
        fi
fi
exit 1


4:uShare的编译

在编译uShare之前,需要跟libDLNA一样都要修改configure文件,如果不改,会出现无法编译的问题,具体的修改如下:

DLNA-基于uShare的DMS移植和编译

默认是在X86的架构中,因此我这里将其修改到ARMV5版本下,这个可以不用改的...

DLNA-基于uShare的DMS移植和编译

一定要在check_lib dlna.h这行的-ldlna的后面加上::-lavcodec -lavformat -lavutil ,编译选项的配置如下:

export LDFLAGS="-L$INSTALL_PATH/lib"
export PKG_CONFIG_PATH=$INSTALL_PATH/lib/pkgconfig
export CFLAGS="-I$INSTALL_PATH/include -I$DLNAPRJ_PATH"
export LIBS="-ldl -lpthread"

if [ -f config.h ]; then
	make distclean
fi

./configure --prefix=$INSTALL_PATH \
            --sysconfdir=/etc \
            --disable-nls \
            --enable-dlna \
            --with-libupnp-dir=$INSTALL_PATH \
            --with-libdlna-dir=$INSTALL_PATH \
            --cross-prefix=arm-linux- \
            --cross-compile

if [ $? -eq 0 ]; then
    make 
    if [ $? -eq 0 ]; then
                make install
		if [ "$?" == "0" ]; then
            cp -a $INSTALL_PATH/bin/ushare 		$NAND_PATH/DlnaServer
			#make DlnaServer iso file
            genromfs -f $RUN_PATH/DlnaServer.bin	-d $NAND_PATH/
			exit 0
		fi
	else
		exit 1
	fi
else
	exit 1
fi
fi


三:总结

 

通过上面的配置和修改之后,就可以编译好uShare的DMS了。。。下一步是应用测试看看。。。