DLNA 移植过程
Dlna简介:
DLNA的全称是DIGITAL LIVING NETWORK ALLIANCE, 其宗旨是Enjoy your music, photos and videos, anywhere anytime, DLNA(Digital Living Network Alliance)由索尼、英特尔、微软等发起成立、旨在解决个人PC,消费电器,移动设备在内的无线网络和有线网络的互联互通,使得数字媒体和内容服务的无限制的共享和增长成为可能,目前成员公司已达280多家。
DLNA并不是创造技术,而是形成一种解决的方案,一种大家可以遵守的规范。所以,其选择的各种技术和协议都是目前所应用很广泛的技术和协议。
DLNA将其整个应用规定成5个功能组件。从下到上依次为:网络互连,网络协议,媒体传输,设备的发现控制和管理,媒体格式。
DLNA功能模块
DMS DMR DMC DMP
DMS:Server
DMR:Renderer
DMC:Control
DMP:Player
工具:upnp inspector是一个不错的查看dlna的工具。
现在linux下通用的dlna支持有很多种,我这里现必要的对ushare、minidlna、mediatomb做出一些研究。
Server的搭建:
Server的搭建非常方便,而且都有相应的config设置可以查看。
Window7 的media player 和twonky都是不错的upnp media server。
Dlnaserver:minidlna-1.0.25
依赖库 | 库版本 | 编译生成的库 |
Libpthread.a | ------ | -------- |
Libexif | libexif-0.6.21 | *.a *.so |
Libjpeg | jpeg-8d |
|
Libsqlite | sqlite-autoconf-3071401 |
|
Libavformat | ffmpeg-0.11.2 |
|
Libavutil | ffmpeg-0.11.2 |
|
Libavcodec | ffmpeg-0.11.2 |
|
Libid3tag | libid3tag-0.15.1b |
|
libFLAC | flac-1.2.1 |
|
Libogg | libogg-1.3.0 |
|
Libvorbis | libvorbis-1.3.3 |
|
Libz(need by libid3tag) | zlib-1.2.5 |
|
Eg:Cross compile ffmeg:
pkg: ffmpeg-0.11.2
#./configure --cross-prefix=arm-none-linux-gnueabi- --enable-cross-compile --arch=arm --disable-stripping --target-os=linux
#make
take about 30minutes to cross-compile.
Compile Libogg:
#./configure CC=arm-none-linux-gnueabi-gcc –host=arm-none-linux-gnueabi --build=arm
#make
libid3tag:
#./configure CC=arm-none-linux-gnueabi-gcc --host=arm-none-linux-gnueabi LDFLAGS=-L$dir/minidlna/libid3tag/zlib-1.2.5 CPPFLAGS=-I$dir/minidlna/libid3tag/zlib-1.2.
Some libaries need libogg need you have the index to make it work.
1.分别逐个对各个库进行交叉编译,编译好后,修改minidlna的makefile,指向库的路径
Minidlna不仅仅依赖那些生成的静态库,还依赖响应的动态库,对这些库的编译是非常重要的。
2.在编译时候一定注意configure选项,只有配置正确,才能编译到正确的库。
3.初始在编译的时候,我把相应的静态库都拷贝到一个目录下,进行了库的路径的统一指定,但是出现了很多undefined reference**,这是因为动态库的包涵没有加入。
4.libid3tag的编译需要zlib的库,同样,连接的时候也需要zlib的库,这一点切记。
5.静态库的连接顺序直接会影响你的编译正确与否,因而我们需要认真的检查相互有依赖关系的静态库的连接顺序。
6.修改minidlna的makefile,将每个库的头文件都包含进来,保证包含路径的正确性。
7.连接,编译。
我自己的makefile当中的顺序如下:
LIBS = -lpthread #-lexif -ljpeg -lsqlite3 -lavformat -lavutil -lavcodec -lid3tag -lFLAC -logg -lvorbis
LIBS+= -L/home/gavinhuang/tar_pkg/minidlna/libexif/libexif-0.6.21/libexif/.libs -lexif
LIBS+= -L/home/gavinhuang/tar_pkg/minidlna/libjpeg/jpeg-8d/.libs -ljpeg
LIBS+= -L/home/gavinhuang/tar_pkg/minidlna/libsqlite3/sqlite-autoconf-3071401/.libs -lsqlite3
LIBS+= -L/home/gavinhuang/tar_pkg/minidlna/libavcodec/ffmpeg-0.11.2/libavformat -lavformat
LIBS+= -L/home/gavinhuang/tar_pkg/minidlna/libavcodec/ffmpeg-0.11.2/libavcodec -lavcodec
LIBS+= -L/home/gavinhuang/tar_pkg/minidlna/libavcodec/ffmpeg-0.11.2/libavutil -lavutil
LIBS+= -L/home/gavinhuang/tar_pkg/minidlna/libid3tag/zlib-1.2.5 -lz
LIBS+= -L/home/gavinhuang/tar_pkg/minidlna/libid3tag/libid3tag-0.15.1b/.libs -lid3tag
LIBS+= -L/home/gavinhuang/tar_pkg/minidlna/libflac/flac-1.2.1/src/libFLAC/.libs -lFLAC
LIBS+= -L/home/gavinhuang/tar_pkg/minidlna/libogg/libogg-1.3.0/src/.libs -logg
LIBS+= -L/home/gavinhuang/tar_pkg/minidlna/libvorbis/libvorbis-1.3.3/lib/.libs –lvorbis
因为libz和libid3tag的依赖关系,因而要将libz放在libid3tag之前。
各个库的作用:
FFMPEG
FFmpeg是一个开源免费跨平台的视频和音频流方案,属于自由软件,采用LGPL或GPL许可证(依据你选择的组件)。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,libavcodec里很多codec都是从头开发的。
libavformat :用于各种音视频封装格式的生成和解析,包括获取解码所需信息以生成解码上下文结构和读取音视频帧等功能;
libavcodec :用于各种类型声音/图像编解码;
libavutil :包含一些公共的工具函数;
POSⅨ thread 简称为pthread,Posix线程是一个POSⅨ标准线程.该标准定
Pthread
Posix thread, 是一个线程标准,libpthread提供基本的线程创建的库。
Libogg
libogg是音频解码的库,libogg包含必要的创建、解码和操作ogg格式码流的库。
Libjpeg
libjpeg 是一个完全用C语言编写的库,包含了被广泛使用的JPEG解码、JPEG编码和其他的JPEG功能的实现。这个库由独立JPEG工作组维护。最新版本号是6b,于1998年发布。
Libexif
libexif是用C编写的函数库,用于从图形文件中读写EXIF元信息
Libid3tag
libid3tag是MPEG音频解码器MAD中所捆绑的ID3标签操控库
Libsqlite
Libsqlite是一个实现自动配置、无需服务端口、事务性的SQL数据库引擎。
Libvorbis
Libvorbis是一种支持多种音频压缩格式的音频解码库。
LibFLAC
文译为无损音频压缩编码。FLAC是一套著名的自由音频压缩编码,其特点是可以对音频文件无损压缩。不同于其他有损压缩编码如MP3及WMA(9.0版本支持无损压缩),它不会破坏任何原有的音频信息,所以可以还原音乐光盘音质。现在它已被很多软件及硬件音频产品所支持。
libFLAC,一个参考的编码及解码程序库,及一个元数据接口