有个IPC的项目有用到live555,简单编译了一下live555的动态库,作为笔记存用,因为也没碰到什么难点,有问题可以联系我
Live555作为一个经典的流媒体开源框架,相信如果你要用到,肯定也有初步了解,我的项目中用到他的RTSP Server。一起来看看它的支持:
The “LIVE555 Media Server” is a complete RTSP server application. It can stream several kinds of media file (which must be stored in the current working directory - i.e., the directory from which you launch the application - or a subdirectory.):
它对应的目录(中间还包含其他目录,包括win和linux编译环境和脚本,我们用不到删除即可):
下载:http://www.live555.com/liveMedia/public/
选择live555-latest.tar.gz
删除用不到的文件,如win和linux编译环境和脚本
Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := live555
#include header
LOCAL_C_INCLUDES := \
$(LOCAL_PATH) \
$(LOCAL_PATH)/BasicUsageEnvironment \
$(LOCAL_PATH)/BasicUsageEnvironment/include \
$(LOCAL_PATH)/groupsock \
$(LOCAL_PATH)/groupsock/include \
$(LOCAL_PATH)/liveMedia \
$(LOCAL_PATH)/liveMedia/include \
$(LOCAL_PATH)/UsageEnvironment \
$(LOCAL_PATH)/UsageEnvironment/include \
$(LOCAL_PATH)/mediaServer \
LOCAL_MODULE_TAGS := optional
#build the needed source file
LOCAL_SRC_FILES := \
BasicUsageEnvironment/BasicHashTable.cpp \
BasicUsageEnvironment/BasicTaskScheduler.cpp \
BasicUsageEnvironment/BasicTaskScheduler0.cpp \
BasicUsageEnvironment/BasicUsageEnvironment.cpp \
BasicUsageEnvironment/BasicUsageEnvironment0.cpp \
BasicUsageEnvironment/DelayQueue.cpp \
groupsock/GroupEId.cpp \
groupsock/Groupsock.cpp \
groupsock/GroupsockHelper.cpp \
groupsock/inet.c \
groupsock/IOHandlers.cpp \
groupsock/NetAddress.cpp \
groupsock/NetInterface.cpp \
UsageEnvironment/HashTable.cpp \
UsageEnvironment/strDup.cpp \
UsageEnvironment/UsageEnvironment.cpp \
liveMedia/QuickTimeFileSink.cpp \
liveMedia/QuickTimeGenericRTPSource.cpp \
liveMedia/RawVideoRTPSink.cpp \
liveMedia/RawVideoRTPSource.cpp \
liveMedia/RTCP.cpp \
liveMedia/rtcp_from_spec.c \
liveMedia/RTPInterface.cpp \
liveMedia/RTPSink.cpp \
liveMedia/RTPSource.cpp \
liveMedia/RTSPClient.cpp \
liveMedia/RTSPCommon.cpp \
liveMedia/RTSPRegisterSender.cpp \
liveMedia/RTSPServer.cpp \
liveMedia/RTSPServerRegister.cpp \
liveMedia/RTSPServerSupportingHTTPStreaming.cpp \
liveMedia/ServerMediaSession.cpp \
liveMedia/SimpleRTPSink.cpp \
liveMedia/SimpleRTPSource.cpp \
liveMedia/SIPClient.cpp \
liveMedia/StreamParser.cpp \
liveMedia/StreamReplicator.cpp \
liveMedia/T140TextRTPSink.cpp \
liveMedia/TCPStreamSink.cpp \
liveMedia/TextRTPSink.cpp \
liveMedia/TheoraVideoRTPSink.cpp \
liveMedia/TheoraVideoRTPSource.cpp \
liveMedia/uLawAudioFilter.cpp \
liveMedia/VideoRTPSink.cpp \
liveMedia/VorbisAudioRTPSink.cpp \
liveMedia/VorbisAudioRTPSource.cpp \
liveMedia/VP8VideoRTPSink.cpp \
liveMedia/VP8VideoRTPSource.cpp \
liveMedia/VP9VideoRTPSink.cpp \
liveMedia/VP9VideoRTPSource.cpp \
liveMedia/WAVAudioFileServerMediaSubsession.cpp \
liveMedia/WAVAudioFileSource.cpp \
liveMedia/MPEG2TransportFileServerMediaSubsession.cpp \
liveMedia/MPEG2TransportStreamAccumulator.cpp \
liveMedia/MPEG2TransportStreamFramer.cpp \
liveMedia/MPEG2TransportStreamFromESSource.cpp \
liveMedia/MPEG2TransportStreamFromPESSource.cpp \
liveMedia/MPEG2TransportStreamIndexFile.cpp \
liveMedia/MPEG2TransportStreamMultiplexor.cpp \
liveMedia/MPEG2TransportStreamTrickModeFilter.cpp \
liveMedia/MPEG2TransportUDPServerMediaSubsession.cpp \
liveMedia/MPEG4ESVideoRTPSink.cpp \
liveMedia/MPEG4ESVideoRTPSource.cpp \
liveMedia/MPEG4GenericRTPSink.cpp \
liveMedia/MPEG4GenericRTPSource.cpp \
liveMedia/MPEG4LATMAudioRTPSink.cpp \
liveMedia/MPEG4LATMAudioRTPSource.cpp \
liveMedia/MPEG4VideoFileServerMediaSubsession.cpp \
liveMedia/MPEG4VideoStreamDiscreteFramer.cpp \
liveMedia/MPEG4VideoStreamFramer.cpp \
liveMedia/MPEGVideoStreamFramer.cpp \
liveMedia/MPEGVideoStreamParser.cpp \
liveMedia/MultiFramedRTPSink.cpp \
liveMedia/MultiFramedRTPSource.cpp \
liveMedia/OggDemuxedTrack.cpp \
liveMedia/OggFile.cpp \
liveMedia/OggFileParser.cpp \
liveMedia/OggFileServerDemux.cpp \
liveMedia/OggFileServerMediaSubsession.cpp \
liveMedia/OggFileSink.cpp \
liveMedia/OnDemandServerMediaSubsession.cpp \
liveMedia/ourMD5.cpp \
liveMedia/OutputFile.cpp \
liveMedia/MatroskaFileServerMediaSubsession.cpp \
liveMedia/Media.cpp \
liveMedia/MediaSession.cpp \
liveMedia/MediaSink.cpp \
liveMedia/MediaSource.cpp \
liveMedia/MP3ADU.cpp \
liveMedia/MP3ADUdescriptor.cpp \
liveMedia/MP3ADUinterleaving.cpp \
liveMedia/MP3ADURTPSink.cpp \
liveMedia/MP3ADURTPSource.cpp \
liveMedia/MP3ADUTranscoder.cpp \
liveMedia/MP3AudioFileServerMediaSubsession.cpp \
liveMedia/MP3AudioMatroskaFileServerMediaSubsession.cpp \
liveMedia/MP3FileSource.cpp \
liveMedia/MP3Internals.cpp \
liveMedia/MP3InternalsHuffman.cpp \
liveMedia/MP3InternalsHuffmanTable.cpp \
liveMedia/MP3StreamState.cpp \
liveMedia/MP3Transcoder.cpp \
liveMedia/MPEG1or2AudioRTPSink.cpp \
liveMedia/MPEG1or2AudioRTPSource.cpp \
liveMedia/MPEG1or2AudioStreamFramer.cpp \
liveMedia/MPEG1or2Demux.cpp \
liveMedia/MPEG1or2DemuxedElementaryStream.cpp \
liveMedia/MPEG1or2DemuxedServerMediaSubsession.cpp \
liveMedia/GSMAudioRTPSink.cpp \
liveMedia/H261VideoRTPSource.cpp \
liveMedia/H263plusVideoFileServerMediaSubsession.cpp \
liveMedia/H263plusVideoRTPSink.cpp \
liveMedia/H263plusVideoRTPSource.cpp \
liveMedia/H263plusVideoStreamFramer.cpp \
liveMedia/H263plusVideoStreamParser.cpp \
liveMedia/H264or5VideoFileSink.cpp \
liveMedia/H264or5VideoRTPSink.cpp \
liveMedia/H264or5VideoStreamDiscreteFramer.cpp \
liveMedia/H264or5VideoStreamFramer.cpp \
liveMedia/H264VideoFileServerMediaSubsession.cpp \
liveMedia/H264VideoFileSink.cpp \
liveMedia/H264VideoRTPSink.cpp \
liveMedia/H264VideoRTPSource.cpp \
liveMedia/H264VideoStreamDiscreteFramer.cpp \
liveMedia/H264VideoStreamFramer.cpp \
liveMedia/H265VideoFileServerMediaSubsession.cpp \
liveMedia/H265VideoFileSink.cpp \
liveMedia/H265VideoRTPSink.cpp \
liveMedia/H265VideoRTPSource.cpp \
liveMedia/H265VideoStreamDiscreteFramer.cpp \
liveMedia/H265VideoStreamFramer.cpp \
liveMedia/InputFile.cpp \
liveMedia/JPEGVideoRTPSink.cpp \
liveMedia/JPEGVideoRTPSource.cpp \
liveMedia/JPEGVideoSource.cpp \
liveMedia/Locale.cpp \
liveMedia/MatroskaDemuxedTrack.cpp \
liveMedia/MatroskaFile.cpp \
liveMedia/MatroskaFileParser.cpp \
liveMedia/AC3AudioFileServerMediaSubsession.cpp \
liveMedia/AC3AudioRTPSink.cpp \
liveMedia/AC3AudioRTPSource.cpp \
liveMedia/AC3AudioStreamFramer.cpp \
liveMedia/ADTSAudioFileServerMediaSubsession.cpp \
liveMedia/ADTSAudioFileSource.cpp \
liveMedia/AMRAudioFileServerMediaSubsession.cpp \
liveMedia/AMRAudioFileSink.cpp \
liveMedia/AMRAudioFileSource.cpp \
liveMedia/AMRAudioRTPSink.cpp \
liveMedia/AMRAudioRTPSource.cpp \
liveMedia/AMRAudioSource.cpp \
liveMedia/AudioInputDevice.cpp \
liveMedia/AudioRTPSink.cpp \
liveMedia/AVIFileSink.cpp \
liveMedia/Base64.cpp \
liveMedia/BasicUDPSink.cpp \
liveMedia/BasicUDPSource.cpp \
liveMedia/BitVector.cpp \
liveMedia/ByteStreamFileSource.cpp \
liveMedia/ByteStreamMemoryBufferSource.cpp \
liveMedia/ByteStreamMultiFileSource.cpp \
liveMedia/DeviceSource.cpp \
liveMedia/DigestAuthentication.cpp \
liveMedia/DVVideoFileServerMediaSubsession.cpp \
liveMedia/DVVideoRTPSink.cpp \
liveMedia/DVVideoRTPSource.cpp \
liveMedia/DVVideoStreamFramer.cpp \
liveMedia/EBMLNumber.cpp \
liveMedia/FileServerMediaSubsession.cpp \
liveMedia/MatroskaFileServerDemux.cpp \
liveMedia/FileSink.cpp \
liveMedia/FramedSource.cpp \
liveMedia/FramedFileSource.cpp \
liveMedia/QCELPAudioRTPSource.cpp \
liveMedia/MPEG1or2FileServerDemux.cpp \
liveMedia/MPEG1or2VideoRTPSink.cpp \
liveMedia/ProxyServerMediaSession.cpp \
liveMedia/MPEG1or2VideoStreamFramer.cpp \
liveMedia/MPEG1or2VideoStreamDiscreteFramer.cpp \
liveMedia/MPEG1or2VideoRTPSource.cpp \
liveMedia/FramedFilter.cpp \
liveMedia/GenericMediaServer.cpp \
mediaServer/DynamicRTSPServer.cpp \
mediaServer/live555MediaServer.cpp \
LOCAL_LDLIBS := -lm -llog
LOCAL_CPPFLAGS := \
-fexceptions -DLOCALE_NOT_USED -DNULL=0 -DNO_SSTREAM=1 -UIP_ADD_SOURCE_MEMBERSHIP
include $(BUILD_SHARED_LIBRARY)
Application.mk
APP_STL := gnustl_static
APP_ABI := armeabi armeabi-v7a
APP_PLATFORM := android-8
错误:
GroupsockHelper.cpp:575:23: error: request for member ‘s_addr’ in ‘imr.ip_mreq_source::imr_multiaddr’, which is of non-class type ‘__be32 {aka unsigned int}’
imr.imr_multiaddr.s_addr = groupAddress;
查看代码:
----------->其中定义的NDK版本
#define ANDROID_OLD_NDK __NDK_MAJOR__ < 17
----------->575报错的代码:其中判断了NDK编版本。我关注自己版本以下即可,注释即可,后面的错误同理
Boolean socketJoinGroupSSM(UsageEnvironment& env, int socket,
netAddressBits groupAddress,
netAddressBits sourceFilterAddr) {
if (!IsMulticastAddress(groupAddress)) return True; // ignore this case
struct ip_mreq_source imr;
#if ANDROID_OLD_NDK
imr.imr_multiaddr = groupAddress;
imr.imr_sourceaddr = sourceFilterAddr;
imr.imr_interface = ReceivingInterfaceAddr;
#else
// imr.imr_multiaddr.s_addr = groupAddress;
// imr.imr_sourceaddr.s_addr = sourceFilterAddr;
// imr.imr_interface.s_addr = ReceivingInterfaceAddr;
#endif
if (setsockopt(socket, IPPROTO_IP, IP_ADD_SOURCE_MEMBERSHIP,
(const char*)&imr, sizeof (struct ip_mreq_source)) < 0) {
socketErr(env, "setsockopt(IP_ADD_SOURCE_MEMBERSHIP) error: ");
return False;
}
clearMulticastAllSocketOption(socket);
return True;
}
我的NDK版本是r14b,android api=8,顺利编译完成了,live555是个很成熟的库,网上也有许多的博客和代码,基本不存在很多编译难题,如果碰到问题,可以从源码中找答案,大多数是编译环境或者宏定义判断导致。只有认真排查,很快就能解决