[Android] Porting the live555 library onto Android

LIVE555 is a well-known multimedia streaming library on low-cost embedded system. It had been ported on armlinux, FreeBSD, iPhone OS, Mac OS X, OpenBSD, and uClinux.

This library uses the open standard streaming protocols such as RTP/RTCP/RTSP/SIP. In this article, we will provide a series of steps for explaining how to port the library onto ARM-based Android System.

Before porting the library, you should prepare these resources,
a. Cross-Compiler:  We can get the cross-compiler from Android Developer Website.
b. The LIVE555 source code: Download Site version: 11-Sep-2013
c. Linux Environment is BEST!


Now, we introduce the steps for you.

Step1: Extract the LIVE555 source code in the target directory.

live555/jni/live/
Step2: Create the Android.mk and Application.mk in the “live555/jni/“.
The content of Application.mk:

  APP_OPTM := release

  APP_ABI := armeabi armeabi-v7a

  APP_PLATFORM := android-10

  APP_STL := stlport_shared

The content of Android.mk:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := live555

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

LOCAL_C_INCLUDES :=
$(LOCAL_PATH)/live/BasicUsageEnvironment/include
$(LOCAL_PATH)/live/UsageEnvironment/include
$(LOCAL_PATH)/live/groupsock/include
$(LOCAL_PATH)/live/liveMedia/include

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

include $(BUILD_SHARED_LIBRARY)

Step3: Start to build the library!
In the directory “live555/“, we should execute the command “ndk-build”. You can add the -j{thread} parameter for the ndk-build to apply the distributed compilation to speed-up the build.

Step4: Got the shared library in the “live555/libs/“. Enjoy it!


Note: LIVE555 native supports iOS phone! SO GOOD!

Reference: 
基于移动平台的多媒体框架——移植Live555到Android上

One comment

發佈留言