I'm trying to stream a video file (h264 raw stream) from Android Device to VLC using Live555. My native code is based on the testh264streamer example, which works fine on Ubuntu.
However, when I try to start the streaming on Android it does not work. The video file is opened successfully and the client receives some packages (I followed it with Wireshark), but VLC does not show anything.
I guess the problem is the connection between Java and C++, so here's my Java-Code, which calls the native streaming method:
public class LiveStreamer implements Runnable {
private static final String LOG_TAG = LiveStreamer.class.getSimpleName();
private Context context;
private String fileName;
private FileDescriptor fileDescriptor;
public LiveStreamer(Context context, String fileName) {
this.context = context;
this.fileName = fileName;
this.prepare();
}
private void prepare() {
try {
fileDescriptor = prepareStream(fileName, fileDescriptor);
} catch (IOException e) {
e.printStackTrace();
}
}
public String getFileName() {
return fileName;
}
public FileDescriptor getFileDescriptor() {
return fileDescriptor;
}
private native void stream(String ipAdress);
private native FileDescriptor prepareStream(String file, FileDescriptor fd)
throws IOException;
@Override
public void run() {
Log.d(LOG_TAG, "Start streaming ...");
String ipAddress = NetworkUtilities.getWifiIpAddress(context);
if (fileDescriptor != null) {
stream(ipAddress);
}
Log.d(LOG_TAG, "Stopp streaming ...");
}
}
And my native code:
JNIEXPORT void JNICALL Java_[PACKAGE_NAME]_LiveStreamer_stream(
JNIEnv *env, jobject obj, jstring ipAddress) {
const char* c_ipaddress = env->GetStringUTFChars(ipAddress, false);
jclass streamClazz = env->GetObjectClass(obj);
jclass exceptionClazz = env->FindClass("java/lang/RuntimeException");
if (streamClazz == NULL || exceptionClazz == NULL) {
return;
}
if (videoFile == NULL) {
return;
}
// setting up the usage environment
TaskScheduler *scheduler = BasicTaskScheduler::createNew();
uenv = BasicUsageEnvironment::createNew(*scheduler);
// Creating groupsocks
struct in_addr destinationAddress;
destinationAddress.s_addr = chooseRandomIPv4SSMAddress(*uenv);
const unsigned short rtpPortNum = 18888;
const unsigned short rtcpPortNum = rtpPortNum + 1;
const unsigned char ttl = 255;
const Port rtpPort(rtpPortNum);
const Port rtcpPort(rtcpPortNum);
Groupsock rtpGroupsockVideo(*uenv, destinationAddress, rtpPort, ttl);
Groupsock rtcpGroupsockVideo(*uenv, destinationAddress, rtcpPort, ttl);
rtpGroupsockVideo.multicastSendOnly();
rtcpGroupsockVideo.multicastSendOnly();
// Create a 'H264 Video RTP' sink from the RTP 'groupsock':
OutPacketBuffer::maxSize = 100000;
rtpVideoSink = H264VideoRTPSink::createNew(*uenv, &rtpGroupsockVideo, 96);
// Create (and start) a 'RTCP instance' for this RTP sink:
logDebug("Starting RTSP server ...");
const unsigned estimatedSessionBandwidth = 10000; // in kbps; for RTCP b/w share
const unsigned maxCNAMElen = 100;
unsigned char CNAME[maxCNAMElen + 1];
gethostname((char*) CNAME, maxCNAMElen);
CNAME[maxCNAMElen] = '\0'; // just in case
RTCPInstance* rtcpVideo = RTCPInstance::createNew(*uenv,
&rtcpGroupsockVideo, estimatedSessionBandwidth, CNAME, rtpVideoSink,
NULL, True);
RTSPServer *rtspServer = RTSPServer::createNew(*uenv, 8554);
if (rtspServer == NULL) {
logError("Failed to create RTSP Server");
exit(1);
}
ServerMediaSession *session = ServerMediaSession::createNew(*uenv,
"herosession", "video.sdp", "Session streamed by \"LiveCam\"",
True);
session->addSubsession(
PassiveServerMediaSubsession::createNew(*rtpVideoSink));
rtspServer->addServerMediaSession(session);
logDebug("RTSP server started ...");
logDebug("Beginning streaming ...");
char* url = rtspServer->rtspURL(session);
logDebug(url);
play();
uenv->taskScheduler().doEventLoop(); // does not return
}
Do you have any suggestions? Thanks for your help!
Edit //
Here's the logcat of my app (seems something unspectular):
01-17 14:00:38.731: D/dalvikvm(32167): Trying to load lib /data/app-lib/de.[PACKAGE]-4/libliveCam.so 0x4252f570
01-17 14:00:38.731: D/dalvikvm(32167): Added shared lib /data/app-lib/de.[PACKAGE]-4/libliveCam.so 0x4252f570
01-17 14:00:38.731: D/dalvikvm(32167): No JNI_OnLoad found in /data/app-lib/de.[PACKAGE]-4/libliveCam.so 0x4252f570, skipping init
01-17 14:00:38.741: I/PersonaManager(32167): getPersonaService() name persona_policy
01-17 14:00:38.771: D/skia(32167): GFXPNG PNG bitmap created width:13 height:41 bitmap id is 180
01-17 14:00:38.781: E/MoreInfoHPW_ViewGroup(32167): Parent view is not a TextView
01-17 14:00:38.801: D/skia(32167): GFXPNG PNG bitmap created width:78 height:96 bitmap id is 181
01-17 14:00:38.811: D/skia(32167): GFXPNG PNG bitmap created width:78 height:96 bitmap id is 182
01-17 14:00:38.811: D/skia(32167): GFXPNG PNG bitmap created width:144 height:144 bitmap id is 183
01-17 14:00:38.821: D/Activity(32167): setTransGradationMode to true
01-17 14:00:38.961: I/Adreno-EGL(32167): <qeglDrvAPI_eglInitialize:410>: EGL 1.4 QUALCOMM build: ()
01-17 14:00:38.961: I/Adreno-EGL(32167): OpenGL ES Shader Compiler Version: E031.24.00.08+13
01-17 14:00:38.961: I/Adreno-EGL(32167): Build Date: 03/20/14 Thu
01-17 14:00:38.961: I/Adreno-EGL(32167): Local Branch: 0320_AU200_patches
01-17 14:00:38.961: I/Adreno-EGL(32167): Remote Branch:
01-17 14:00:38.961: I/Adreno-EGL(32167): Local Patches:
01-17 14:00:38.961: I/Adreno-EGL(32167): Reconstruct Branch:
01-17 14:00:38.991: D/OpenGLRenderer(32167): Enabling debug mode 0
01-17 14:00:42.611: D/LiveStreamer(32167): Start streaming ...
01-17 14:00:42.631: D/LiveCam(32167): Starting RTSP server ...
01-17 14:00:42.631: D/LiveCam(32167): RTSP server started ...
01-17 14:00:42.631: D/LiveCam(32167): Beginning streaming ...
01-17 14:00:42.631: D/LiveCam(32167): rtsp://141.24.13.60:8554/herosession
01-17 14:00:42.631: D/LiveCam(32167): Beginning to read from file ...
01-17 14:00:42.631: D/LiveCam(32167): ...done reading from file
01-17 14:00:42.631: D/LiveCam(32167): Beginning to read from file ...
And here's the debug output of vlc:
[000000000119b188] core playlist debug: adding item `rtsp://141.24.13.60:8554/herosession' ( rtsp://141.24.13.60:8554/herosession )
[000000000119b188] core playlist debug: meta ok for (null), need to fetch art
[000000000119b188] core playlist debug: processing request item: rtsp://141.24.13.60:8554/herosession, node: null, skip: 0
[000000000119b188] core playlist debug: rebuilding array of current - root Wiedergabeliste
[000000000119b188] core playlist debug: rebuild done - 1 items, index 0
[000000000119b188] core playlist debug: starting playback of the new playlist item
[000000000119b188] core playlist debug: resyncing on rtsp://141.24.13.60:8554/herosession
[000000000119b188] core playlist debug: rtsp://141.24.13.60:8554/herosession is at 0
[000000000119b188] core playlist debug: creating new input thread
[00007fb48c0009b8] core input debug: Creating an input for 'rtsp://141.24.13.60:8554/herosession'
[00007fb494000cf8] core art finder debug: looking for meta fetcher module matching "any": 1 candidates
[000000000119b188] core playlist debug: requesting art for rtsp://141.24.13.60:8554/herosession
[00007fb48c0009b8] core input debug: using timeshift granularity of 50 MiB, in path '/tmp'
[00007fb48c0009b8] core input debug: `rtsp://141.24.13.60:8554/herosession' gives access `rtsp' demux `' path `141.24.13.60:8554/herosession'
[00007fb48c0009b8] core input debug: specified demux `any'
[00007fb48c0009b8] core input debug: creating demux: access='rtsp' demux='any' location='141.24.13.60:8554/herosession' file='(null)'
[00007fb484000958] core art finder debug: looking for meta fetcher module matching "any": 1 candidates
[00007fb490000e38] core demux debug: looking for access_demux module matching "rtsp": 21 candidates
[00007fb490000e38] live555 demux debug: version 2014.01.13
[00000000011b57b8] qt4 interface debug: IM: Setting an input
Opening connection to 141.24.13.60, port 8554...
[00007fb484000958] lua art finder debug: Trying Lua scripts in /home/robin/.local/share/vlc/lua/meta/fetcher
[00007fb484000958] lua art finder debug: Trying Lua scripts in /usr/lib/vlc/lua/meta/fetcher
[00007fb484000958] lua art finder debug: Trying Lua playlist script /usr/lib/vlc/lua/meta/fetcher/tvrage.luac
[00007fb494000cf8] lua art finder debug: Trying Lua scripts in /home/robin/.local/share/vlc/lua/meta/fetcher
[00007fb494000cf8] lua art finder debug: Trying Lua scripts in /usr/lib/vlc/lua/meta/fetcher
[00007fb494000cf8] lua art finder debug: Trying Lua playlist script /usr/lib/vlc/lua/meta/fetcher/tvrage.luac
[00007fb494000cf8] lua art finder debug: skipping script (unmatched scope) /usr/lib/vlc/lua/meta/fetcher/tvrage.luac
[00007fb494000cf8] lua art finder debug: Trying Lua scripts in /usr/share/vlc/lua/meta/fetcher
[00007fb494000cf8] core art finder debug: no meta fetcher modules matched
[00007fb484000958] lua art finder debug: skipping script (unmatched scope) /usr/lib/vlc/lua/meta/fetcher/tvrage.luac
[00007fb484000958] lua art finder debug: Trying Lua scripts in /usr/share/vlc/lua/meta/fetcher
[00007fb484000958] core art finder debug: no meta fetcher modules matched
[0000000001187118] core libvlc debug: searching art for rtsp://141.24.13.60:8554/herosession
[00007fb484000958] core art finder debug: looking for art finder module matching "any": 2 candidates
[000000000119b188] core playlist debug: searching art for rtsp://141.24.13.60:8554/herosession
[00007fb494000cf8] core art finder debug: looking for art finder module matching "any": 2 candidates
[00007fb494000cf8] lua art finder debug: Trying Lua scripts in /home/robin/.local/share/vlc/lua/meta/art
[00007fb494000cf8] lua art finder debug: Trying Lua scripts in /usr/lib/vlc/lua/meta/art
[00007fb494000cf8] lua art finder debug: Trying Lua playlist script /usr/lib/vlc/lua/meta/art/00_musicbrainz.luac
[00007fb484000958] lua art finder debug: Trying Lua scripts in /home/robin/.local/share/vlc/lua/meta/art
[00007fb484000958] lua art finder debug: Trying Lua scripts in /usr/lib/vlc/lua/meta/art
[00007fb484000958] lua art finder debug: Trying Lua playlist script /usr/lib/vlc/lua/meta/art/00_musicbrainz.luac
[00007fb484000958] lua art finder debug: skipping script (unmatched scope) /usr/lib/vlc/lua/meta/art/00_musicbrainz.luac
[00007fb484000958] lua art finder debug: Trying Lua playlist script /usr/lib/vlc/lua/meta/art/01_googleimage.luac
[00007fb494000cf8] lua art finder debug: skipping script (unmatched scope) /usr/lib/vlc/lua/meta/art/00_musicbrainz.luac
[00007fb494000cf8] lua art finder debug: Trying Lua playlist script /usr/lib/vlc/lua/meta/art/01_googleimage.luac
...remote connection opened
Sending request: OPTIONS rtsp://141.24.13.60:8554/herosession RTSP/1.0
CSeq: 2
User-Agent: LibVLC/2.2.0-pre2 (LIVE555 Streaming Media v2014.01.13)
[00007fb484000958] lua art finder debug: skipping script (unmatched scope) /usr/lib/vlc/lua/meta/art/01_googleimage.luac
[00007fb484000958] lua art finder debug: Trying Lua playlist script /usr/lib/vlc/lua/meta/art/02_frenchtv.luac
[00007fb494000cf8] lua art finder debug: skipping script (unmatched scope) /usr/lib/vlc/lua/meta/art/01_googleimage.luac
[00007fb494000cf8] lua art finder debug: Trying Lua playlist script /usr/lib/vlc/lua/meta/art/02_frenchtv.luac
[00007fb484000958] lua art finder debug: skipping script (unmatched scope) /usr/lib/vlc/lua/meta/art/02_frenchtv.luac
[00007fb484000958] lua art finder debug: Trying Lua playlist script /usr/lib/vlc/lua/meta/art/03_lastfm.luac
Received 152 new bytes of response data.
Received a complete OPTIONS response:
RTSP/1.0 200 OK
CSeq: 2
Date: Sat, Jan 17 2015 13:06:24 GMT
Public: OPTIONS, DESCRIBE, SETUP, TEARDOWN, PLAY, PAUSE, GET_PARAMETER, SET_PARAMETER
Sending request: DESCRIBE rtsp://141.24.13.60:8554/herosession RTSP/1.0
CSeq: 3
User-Agent: LibVLC/2.2.0-pre2 (LIVE555 Streaming Media v2014.01.13)
Accept: application/sdp
[00007fb494000cf8] lua art finder debug: skipping script (unmatched scope) /usr/lib/vlc/lua/meta/art/02_frenchtv.luac
[00007fb494000cf8] lua art finder debug: Trying Lua playlist script /usr/lib/vlc/lua/meta/art/03_lastfm.luac
Received 617 new bytes of response data.
[00007fb484000958] lua art finder debug: skipping script (unmatched scope) /usr/lib/vlc/lua/meta/art/03_lastfm.luac
Received a complete DESCRIBE response:
RTSP/1.0 200 OK
CSeq: 3
Date: Sat, Jan 17 2015 13:06:24 GMT
Content-Base: rtsp://141.24.13.60:8554/herosession/
Content-Type: application/sdp
Content-Length: 447
v=0
o=- 1421499976435789 1 IN IP4 141.24.13.60
s=Session streamed by "LiveCam"
i=video.sdp
t=0 0
a=tool:LIVE555 Streaming Media v2015.01.04
a=type:broadcast
a=control:*
a=source-filter: incl IN IP4 * 141.24.13.60
a=rtcp-unicast: reflection
a=range:npt=0-
a=x-qt-text-nam:Session streamed by "LiveCam"
a=x-qt-text-inf:video.sdp
m=video 18888 RTP/AVP 96
c=IN IP4 232.240.223.192/255
b=AS:50
a=rtpmap:96 H264/90000
a=control:track1
[00007fb484000958] lua art finder debug: Trying Lua scripts in /usr/share/vlc/lua/meta/art
[00007fb484000958] core art finder debug: no art finder modules matched
[00007fb484000958] core art finder debug: looking for meta fetcher module matching "any": 1 candidates
[00007fb490000e38] live555 demux debug: RTP subsession 'video/H264'
Sending request: SETUP rtsp://141.24.13.60:8554/herosession/track1 RTSP/1.0
CSeq: 4
User-Agent: LibVLC/2.2.0-pre2 (LIVE555 Streaming Media v2014.01.13)
Transport: RTP/AVP;multicast;client_port=18888-18889
[00007fb494000cf8] lua art finder debug: skipping script (unmatched scope) /usr/lib/vlc/lua/meta/art/03_lastfm.luac
[00007fb494000cf8] lua art finder debug: Trying Lua scripts in /usr/share/vlc/lua/meta/art
[00007fb494000cf8] core art finder debug: no art finder modules matched
[00007fb494000cf8] core art finder debug: looking for meta fetcher module matching "any": 1 candidates
[00007fb484000958] lua art finder debug: Trying Lua scripts in /home/robin/.local/share/vlc/lua/meta/fetcher
[00007fb484000958] lua art finder debug: Trying Lua scripts in /usr/lib/vlc/lua/meta/fetcher
[00007fb484000958] lua art finder debug: Trying Lua playlist script /usr/lib/vlc/lua/meta/fetcher/tvrage.luac
Received 194 new bytes of response data.
Received a complete SETUP response:
RTSP/1.0 200 OK
CSeq: 4
Date: Sat, Jan 17 2015 13:06:24 GMT
Transport: RTP/AVP;multicast;destination=232.240.223.192;source=141.24.13.60;port=18888-0;ttl=255
Session: 247BEDD2;timeout=65
[00007fb48c0009b8] core input debug: selecting program id=0
[00007fb490000e38] live555 demux debug: setup start: 0,000000 stop:0,000000
Sending request: PLAY rtsp://141.24.13.60:8554/herosession/ RTSP/1.0
CSeq: 5
User-Agent: LibVLC/2.2.0-pre2 (LIVE555 Streaming Media v2014.01.13)
Session: 247BEDD2
Range: npt=0.000-
[00007fb494000cf8] lua art finder debug: Trying Lua scripts in /home/robin/.local/share/vlc/lua/meta/fetcher
[00007fb494000cf8] lua art finder debug: Trying Lua scripts in /usr/lib/vlc/lua/meta/fetcher
[00007fb494000cf8] lua art finder debug: Trying Lua playlist script /usr/lib/vlc/lua/meta/fetcher/tvrage.luac
[00007fb484000958] core art finder debug: using meta fetcher module "lua"
[00007fb484000958] core art finder debug: removing module "lua"
[0000000001187118] core libvlc debug: searching art for rtsp://141.24.13.60:8554/herosession
[00007fb484000958] core art finder debug: looking for art finder module matching "any": 2 candidates
Received 191 new bytes of response data.
Received a complete PLAY response:
RTSP/1.0 200 OK
CSeq: 5
Date: Sat, Jan 17 2015 13:06:24 GMT
Range: npt=0.000-
Session: 247BEDD2
RTP-Info: url=rtsp://141.24.13.60:8554/herosession/track1;seq=21427;rtptime=3001652764
[00007fb490000e38] live555 demux debug: We have a timeout of 65 seconds
[00007fb490000e38] live555 demux debug: spawned timeout thread
[00007fb490000e38] live555 demux debug: play start: 0,000000 stop:0,000000
[00007fb490000e38] core demux debug: using access_demux module "live555"
[00007fb49000c238] core decoder debug: looking for decoder module matching "any": 42 candidates
[00007fb494000cf8] core art finder debug: using meta fetcher module "lua"
[00007fb494000cf8] core art finder debug: removing module "lua"
[000000000119b188] core playlist debug: searching art for rtsp://141.24.13.60:8554/herosession
[00007fb494000cf8] core art finder debug: looking for art finder module matching "any": 2 candidates
[00007fb484000958] lua art finder debug: Trying Lua scripts in /home/robin/.local/share/vlc/lua/meta/art
[00007fb484000958] lua art finder debug: Trying Lua scripts in /usr/lib/vlc/lua/meta/art
[00007fb484000958] lua art finder debug: Trying Lua playlist script /usr/lib/vlc/lua/meta/art/00_musicbrainz.luac
[00007fb484000958] lua art finder debug: Trying Lua playlist script /usr/lib/vlc/lua/meta/art/01_googleimage.luac
[00007fb494000cf8] lua art finder debug: Trying Lua scripts in /home/robin/.local/share/vlc/lua/meta/art
[00007fb494000cf8] lua art finder debug: Trying Lua scripts in /usr/lib/vlc/lua/meta/art
[00007fb494000cf8] lua art finder debug: Trying Lua playlist script /usr/lib/vlc/lua/meta/art/00_musicbrainz.luac
[00007fb484000958] lua art finder debug: Trying Lua playlist script /usr/lib/vlc/lua/meta/art/02_frenchtv.luac
[00007fb494000cf8] lua art finder debug: Trying Lua playlist script /usr/lib/vlc/lua/meta/art/01_googleimage.luac
[00007fb49000c238] avcodec decoder debug: CPU flags: 0x000053db
[00007fb484000958] lua art finder debug: Trying Lua playlist script /usr/lib/vlc/lua/meta/art/03_lastfm.luac
[00007fb49000c238] avcodec decoder debug: trying to use direct rendering
[00007fb49000c238] avcodec decoder debug: allowing 4 thread(s) for decoding
[00007fb494000cf8] lua art finder debug: Trying Lua playlist script /usr/lib/vlc/lua/meta/art/02_frenchtv.luac
[00007fb49000c238] avcodec decoder debug: avcodec codec (H264 - MPEG-4 AVC (part 10)) started
[00007fb49000c238] avcodec decoder debug: using frame thread mode with 4 threads
[00007fb49000c238] core decoder debug: using decoder module "avcodec"
[00007fb4901ad358] core packetizer debug: looking for packetizer module matching "any": 22 candidates
[00007fb4901ad358] core packetizer debug: using packetizer module "packetizer_h264"
[00007fb4901b33a8] core demux meta debug: looking for meta reader module matching "any": 2 candidates
[00007fb484000958] lua art finder debug: Trying Lua scripts in /usr/share/vlc/lua/meta/art
[00007fb484000958] core art finder debug: no art finder modules matched
[0000000001187118] core libvlc debug: art not found for rtsp://141.24.13.60:8554/herosession
[00007fb494000cf8] lua art finder debug: Trying Lua playlist script /usr/lib/vlc/lua/meta/art/03_lastfm.luac
[00007fb4901b33a8] lua demux meta debug: Trying Lua scripts in /home/robin/.local/share/vlc/lua/meta/reader
[00007fb4901b33a8] lua demux meta debug: Trying Lua scripts in /usr/lib/vlc/lua/meta/reader
[00007fb4901b33a8] lua demux meta debug: Trying Lua playlist script /usr/lib/vlc/lua/meta/reader/filename.luac
[00007fb494000cf8] lua art finder debug: Trying Lua scripts in /usr/share/vlc/lua/meta/art
[00007fb494000cf8] core art finder debug: no art finder modules matched
[000000000119b188] core playlist debug: art not found for rtsp://141.24.13.60:8554/herosession
[00007fb4901b33a8] lua demux meta debug: Trying Lua scripts in /usr/share/vlc/lua/meta/reader
[00007fb4901b33a8] core demux meta debug: no meta reader modules matched
[00007fb48c0009b8] core input debug: `rtsp://141.24.13.60:8554/herosession' successfully opened
Sending request: GET_PARAMETER rtsp://141.24.13.60:8554/herosession/ RTSP/1.0
CSeq: 6
User-Agent: LibVLC/2.2.0-pre2 (LIVE555 Streaming Media v2014.01.13)
Session: 247BEDD2
Received 114 new bytes of response data.
Received a complete GET_PARAMETER response:
RTSP/1.0 200 OK
CSeq: 6
Date: Sat, Jan 17 2015 13:06:24 GMT
Session: 247BEDD2
Content-Length: 10
2015.01.04