基於移動平臺的多媒體框架——移植Live555到Android上

基於移動平臺的多媒體框架——移植Live555到Android上



live555是一個處理流媒體傳輸對c++庫,再Mplayer與vlc中都有用到。我們計劃將其加入到自己編寫對Android上的播放器中作爲流媒體模塊,首先就需要將這個庫移植到Android上。

1. 首先在官網下載live555對源碼並解壓。
2. 新建一個Android工程,將源碼文件放到一個該工程的jni目錄下,如:jni/live。
3. 新建jni/Android.mk文件作爲Makefile。將需要編譯對源文件加入到LOCAL_SRC_FILES變量,將需要引用對頭文件加入到LOCAL_C_INCLUDES,編譯過程中會提示需要參數:-fexceptions,於是加入參數LOCAL_CPPFLAGS += -fexceptions。

內容如下:

4. 新建jni/Application.mk文件。由於live555需要引用stl,所以加入:
APP_STL := gnustl_shared

5. 運行ndk-build就可以得到live555.so文件啦。


後記:

至今爲止,我們已經向Android上移植了三個c/c++的庫了(ffmpeg、sdl、live555)。如果有按着步驟一步步的做過,相信大家已經很熟悉如何向Android上移植一個c/c++庫裏。舉一反三,融會貫通,相信以後遇到一個新的c/c++工程,你也會覺得輕而易舉手到擒來啦!


補充:

本來打算把自己移植好的src發給在回覆中留言的幾位朋友的,但查了一下發現硬盤坑爹地被我格過幾次,東西早就沒有了。鑑於這個工作不那麼複雜,我索性再做一遍,順便把移植的過程寫的詳細點,便於他人蔘考。

1. 下載了最新的live555源碼,日期是12/04/04,用的ndk版本是r7b。

2.預備工作,先用標準的方法make一下,確定你的源碼是可以編譯過的。

./genMakefiles linux
make
馬上就看到成功的結果了,這時不要急得移植。移植是交叉編譯了,咱們先不用交叉編譯,用gcc編譯看看會不會。

瞭解live555的基本結構之後就可以執行:

g++ BasicUsageEnvironment/*.cpp liveMedia/*.cpp mediaServer/*.cpp UsageEnvironment/*.cpp ./groupsock/*cpp -IBasicUsageEnvironment/include -IliveMedia/include -IBasicUsageEnvironment/include -Igroupsock/include/ -IUsageEnvironment/include -DSOCKLEN_T=socklen_t -shared -o live555.so
這樣在本地就生成一個so了。

3. 跟本地一樣,如果你瞭解了ndk的用法,寫個簡單的mk文件就可以移植了。建工程什麼的在上面說了,我就把mk文件貼出來給大家參考一下好了。爲了省事,我就建了一個Android.mk文件。寫的過程就是碰到什麼問題,就改改加加什麼參數。(這次連Application.mk都沒有加就過了。。。)

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := live555

LOCAL_SRC_FILES :=\
./live/groupsock/GroupEId.cpp \
./live/groupsock/IOHandlers.cpp \
./live/groupsock/NetInterface.cpp \
./live/groupsock/NetAddress.cpp \
./live/groupsock/GroupsockHelper.cpp \
./live/groupsock/Groupsock.cpp \
./live/groupsock/inet.c \
./live/BasicUsageEnvironment/DelayQueue.cpp \
./live/BasicUsageEnvironment/BasicHashTable.cpp \
./live/BasicUsageEnvironment/BasicUsageEnvironment.cpp \
./live/BasicUsageEnvironment/BasicUsageEnvironment0.cpp \
./live/BasicUsageEnvironment/BasicTaskScheduler.cpp \
./live/BasicUsageEnvironment/BasicTaskScheduler0.cpp \
./live/UsageEnvironment/HashTable.cpp \
./live/UsageEnvironment/strDup.cpp \
./live/UsageEnvironment/UsageEnvironment.cpp \
./live/liveMedia/MP3Internals.cpp \
./live/liveMedia/StreamReplicator.cpp \
./live/liveMedia/MPEG4GenericRTPSource.cpp \
./live/liveMedia/BitVector.cpp \
./live/liveMedia/MatroskaFileParser.cpp \
./live/liveMedia/ADTSAudioFileServerMediaSubsession.cpp \
./live/liveMedia/H264VideoRTPSink.cpp \
./live/liveMedia/MP3StreamState.cpp \
./live/liveMedia/RTSPServerSupportingHTTPStreaming.cpp \
./live/liveMedia/MP3AudioMatroskaFileServerMediaSubsession.cpp \
./live/liveMedia/InputFile.cpp \
./live/liveMedia/MPEGVideoStreamParser.cpp \
./live/liveMedia/AMRAudioFileSource.cpp \
./live/liveMedia/Locale.cpp \
./live/liveMedia/T140TextRTPSink.cpp \
./live/liveMedia/MediaSink.cpp \
./live/liveMedia/QuickTimeFileSink.cpp \
./live/liveMedia/RTPSink.cpp \
./live/liveMedia/VorbisAudioRTPSink.cpp \
./live/liveMedia/AMRAudioFileSink.cpp \
./live/liveMedia/MP3ADUTranscoder.cpp \
./live/liveMedia/VorbisAudioMatroskaFileServerMediaSubsession.cpp \
./live/liveMedia/H264VideoFileServerMediaSubsession.cpp \
./live/liveMedia/H263plusVideoRTPSource.cpp \
./live/liveMedia/RTSPClient.cpp \
./live/liveMedia/DVVideoRTPSource.cpp \
./live/liveMedia/H264VideoStreamFramer.cpp \
./live/liveMedia/DVVideoStreamFramer.cpp \
./live/liveMedia/MultiFramedRTPSink.cpp \
./live/liveMedia/BasicUDPSink.cpp \
./live/liveMedia/Base64.cpp \
./live/liveMedia/H261VideoRTPSource.cpp \
./live/liveMedia/MP3InternalsHuffman.cpp \
./live/liveMedia/MPEG2TransportStreamMultiplexor.cpp \
./live/liveMedia/MP3AudioFileServerMediaSubsession.cpp \
./live/liveMedia/MPEG1or2AudioRTPSource.cpp \
./live/liveMedia/H263plusVideoFileServerMediaSubsession.cpp \
./live/liveMedia/MP3Transcoder.cpp \
./live/liveMedia/H263plusVideoStreamParser.cpp \
./live/liveMedia/AudioInputDevice.cpp \
./live/liveMedia/MP3FileSource.cpp \
./live/liveMedia/MPEG4LATMAudioRTPSource.cpp \
./live/liveMedia/MPEG2TransportStreamFromPESSource.cpp \
./live/liveMedia/AACAudioMatroskaFileServerMediaSubsession.cpp \
./live/liveMedia/WAVAudioFileServerMediaSubsession.cpp \
./live/liveMedia/MP3ADURTPSource.cpp \
./live/liveMedia/FileSink.cpp \
./live/liveMedia/MPEG1or2DemuxedServerMediaSubsession.cpp \
./live/liveMedia/MP3InternalsHuffmanTable.cpp \
./live/liveMedia/TCPStreamSink.cpp \
./live/liveMedia/MediaSource.cpp \
./live/liveMedia/MPEG2TransportStreamFramer.cpp \
./live/liveMedia/JPEGVideoRTPSink.cpp \
./live/liveMedia/JPEGVideoSource.cpp \
./live/liveMedia/AC3AudioFileServerMediaSubsession.cpp \
./live/liveMedia/AMRAudioRTPSink.cpp \
./live/liveMedia/MPEG4VideoFileServerMediaSubsession.cpp \
./live/liveMedia/AMRAudioFileServerMediaSubsession.cpp \
./live/liveMedia/H264VideoMatroskaFileServerMediaSubsession.cpp \
./live/liveMedia/MPEG2IndexFromTransportStream.cpp \
./live/liveMedia/MPEG1or2FileServerDemux.cpp \
./live/liveMedia/GSMAudioRTPSink.cpp \
./live/liveMedia/MPEG1or2VideoStreamFramer.cpp \
./live/liveMedia/AMRAudioRTPSource.cpp \
./live/liveMedia/EBMLNumber.cpp \
./live/liveMedia/MP3ADUinterleaving.cpp \
./live/liveMedia/SimpleRTPSink.cpp \
./live/liveMedia/MPEG1or2VideoRTPSink.cpp \
./live/liveMedia/MPEG2TransportStreamTrickModeFilter.cpp \
./live/liveMedia/AC3AudioRTPSource.cpp \
./live/liveMedia/MultiFramedRTPSource.cpp \
./live/liveMedia/ServerMediaSession.cpp \
./live/liveMedia/JPEGVideoRTPSource.cpp \
./live/liveMedia/MP3ADU.cpp \
./live/liveMedia/FileServerMediaSubsession.cpp \
./live/liveMedia/DVVideoFileServerMediaSubsession.cpp \
./live/liveMedia/DarwinInjector.cpp \
./live/liveMedia/OnDemandServerMediaSubsession.cpp \
./live/liveMedia/H263plusVideoRTPSink.cpp \
./live/liveMedia/TextRTPSink.cpp \
./live/liveMedia/MPEG1or2VideoStreamDiscreteFramer.cpp \
./live/liveMedia/MediaSession.cpp \
./live/liveMedia/AC3AudioStreamFramer.cpp \
./live/liveMedia/QuickTimeGenericRTPSource.cpp \
./live/liveMedia/SimpleRTPSource.cpp \
./live/liveMedia/FramedFileSource.cpp \
./live/liveMedia/T140TextMatroskaFileServerMediaSubsession.cpp \
./live/liveMedia/PassiveServerMediaSubsession.cpp \
./live/liveMedia/ByteStreamMemoryBufferSource.cpp \
./live/liveMedia/RTCP.cpp \
./live/liveMedia/MP3ADURTPSink.cpp \
./live/liveMedia/ADTSAudioFileSource.cpp \
./live/liveMedia/MPEG1or2VideoRTPSource.cpp \
./live/liveMedia/MPEG1or2VideoFileServerMediaSubsession.cpp \
./live/liveMedia/MPEG4ESVideoRTPSink.cpp \
./live/liveMedia/RTPSource.cpp \
./live/liveMedia/H264VideoStreamDiscreteFramer.cpp \
./live/liveMedia/AVIFileSink.cpp \
./live/liveMedia/StreamParser.cpp \
./live/liveMedia/MPEG2TransportStreamFromESSource.cpp \
./live/liveMedia/VP8VideoRTPSink.cpp \
./live/liveMedia/FramedFilter.cpp \
./live/liveMedia/VideoRTPSink.cpp \
./live/liveMedia/MPEG4VideoStreamDiscreteFramer.cpp \
./live/liveMedia/QCELPAudioRTPSource.cpp \
./live/liveMedia/MPEG4VideoStreamFramer.cpp \
./live/liveMedia/Media.cpp \
./live/liveMedia/ByteStreamMultiFileSource.cpp \
./live/liveMedia/MPEG2TransportUDPServerMediaSubsession.cpp \
./live/liveMedia/H263plusVideoStreamFramer.cpp \
./live/liveMedia/VorbisAudioRTPSource.cpp \
./live/liveMedia/RTSPCommon.cpp \
./live/liveMedia/FramedSource.cpp \
./live/liveMedia/MatroskaDemuxedTrack.cpp \
./live/liveMedia/MPEG1or2AudioStreamFramer.cpp \
./live/liveMedia/VP8VideoMatroskaFileServerMediaSubsession.cpp \
./live/liveMedia/MPEG1or2Demux.cpp \
./live/liveMedia/AudioRTPSink.cpp \
./live/liveMedia/DeviceSource.cpp \
./live/liveMedia/MPEG1or2AudioRTPSink.cpp \
./live/liveMedia/ByteStreamFileSource.cpp \
./live/liveMedia/WAVAudioFileSource.cpp \
./live/liveMedia/uLawAudioFilter.cpp \
./live/liveMedia/RTSPServer.cpp \
./live/liveMedia/VP8VideoRTPSource.cpp \
./live/liveMedia/H264VideoRTPSource.cpp \
./live/liveMedia/MatroskaFileServerDemux.cpp \
./live/liveMedia/MPEG4LATMAudioRTPSink.cpp \
./live/liveMedia/MPEG2TransportStreamIndexFile.cpp \
./live/liveMedia/SIPClient.cpp \
./live/liveMedia/MP3HTTPSource.cpp \
./live/liveMedia/BasicUDPSource.cpp \
./live/liveMedia/AC3AudioMatroskaFileServerMediaSubsession.cpp \
./live/liveMedia/H264VideoFileSink.cpp \
./live/liveMedia/MPEG2TransportFileServerMediaSubsession.cpp \
./live/liveMedia/DigestAuthentication.cpp \
./live/liveMedia/MPEG4ESVideoRTPSource.cpp \
./live/liveMedia/MatroskaFile.cpp \
./live/liveMedia/MP3ADUdescriptor.cpp \
./live/liveMedia/AMRAudioSource.cpp \
./live/liveMedia/MPEG4GenericRTPSink.cpp \
./live/liveMedia/MPEGVideoStreamFramer.cpp \
./live/liveMedia/AC3AudioRTPSink.cpp \
./live/liveMedia/DVVideoRTPSink.cpp \
./live/liveMedia/OutputFile.cpp \
./live/liveMedia/MPEG1or2DemuxedElementaryStream.cpp \
./live/liveMedia/RTPInterface.cpp \
./live/liveMedia/our_md5hl.c \
./live/liveMedia/our_md5.c \
./live/liveMedia/rtcp_from_spec.c 


LOCAL_C_INCLUDES := \
./live/BasicUsageEnvironment/include \
./live/liveMedia/include \
./live/BasicUsageEnvironment/include \
./live/groupsock/include \
./live/UsageEnvironment/include

LOCAL_CPPFLAGS += -fexceptions -DXLOCALE_NOT_USED=1 -DNULL=0 -DNO_SSTREAM=1 -UIP_ADD_SOURCE_MEMBERSHIP

include $(BUILD_SHARED_LIBRARY)


(有關in_addr的地方編譯不過的,稍微修改下源碼,去掉s_addr即可。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章