[Live-devel] Custom FramedSource for testOnDemandRTSPServer Problem
Jeremiah Morrill
Jeremiah.Morrill at econnect.tv
Thu Feb 2 11:18:24 PST 2012
While I didn't look at your code in detail, I didn't see you mention what you did with the h264 "subsession->fmtp_spropparametersets()".
In order for VLC to play, I believe you need to send the NAL units. Try parsing the fmtp_spropparametersets with parseSPropParameters(...), and write each returned SPropRec::sPropBytes to a file like you are doing with your frames. Make sure these get sent out first with playback.
Take my advice with a grain of salt as I'm still fairly new to these libs. :)
-Jer
-----Original Message-----
From: live-devel-bounces at ns.live555.com [mailto:live-devel-bounces at ns.live555.com] On Behalf Of Novalis Vapuru
Sent: Wednesday, February 01, 2012 8:32 AM
To: LIVE555 Streaming Media - development & use
Subject: [Live-devel] Custom FramedSource for testOnDemandRTSPServer Problem
Hi,
I finally able to modify testOnDemandRTSPServer so that:
It uses my custom FramedSource...
Tests
--------
Test One:
--------
In order to test it:
1. I get video stream from h264 ip camera using OpenRTSPClient and
write each Frame to a single file[ Boolean oneFilePerFrame = True] for 100 frame.
2. I rename each frame file as vide1,...... video100
3. I stream those frames[ 1...100] with my modified OnDemandRTSPServer using my custom FramedSource 4. I used OpenRTSPClient to connect modified OnDemandRTSPServer.
----------
Test Two:
---------
Just change step 4 [above]:
For step 4 i used VLC player as a client
Test Result:
----------------
Test Result One
----------------
OpenRTSPClient successfully connect and write incoming data to single file [Boolean oneFilePerFrame = True] call it Result.h264 The Result.h264 is not a playbale file.I investigate its binary data with hex editor and MediaInfo Utility.
It does not seem to be correct H264 file...
-----------------
Test Result Two
-----------------
VLC connect to server but dows not show any stream
////////////////////////////////////////////////////////////////////
So Here is my Questions:
1. Is my test logic true? Should i expect to playable file at OpenRTSPClient side?
Should I expect VLC should play file?
2. If my logic true, what i may do wrong in practice?
Wellcome to any ideas-suggestions from who develop such a custom FramedSource for testOnDemandRTSPServer...
Best Wishes
PS:-----------------------------------------------------------------------------------------------------------------------------
I attach my modified testOnDemandRTSPServer code below
Files:
MyCustomFramedSource.h : This is a custom FramedSource for my custom MyCustomServerMediaSubsession MyCustomServerMediaSubsession.h : This is a custom OnDemandServerMediaSubsession.
TestOnDemandRTSPServer.cpp : Simple test for my server
More PS:------------------------------------------------------------------------------------------------------------
As you can see from my MyCustomFramedSource.cpp I stream file on windows env, like this at deliverFrame
// Just for test if my logic true
// not a production ready code
void MyCustomFramedSource::deliverFrame()
{
cout << "Now deliverFrame() is called" << endl;
if (!isCurrentlyAwaitingData())
{
cout << " we're not ready for the data yet" << endl;
return; // we're not ready for the data yet
}
cout << " we're ready for the data" << endl;
static int frameNumber = 0;
struct stat results;
char filename[256];
if(frameNumber >= 100)
{
cout << "finished " << endl;
return;
}
sprintf_s(filename, 256, "D:\\h264\\frame%d.bin", frameNumber++);
stat(filename, &results);
unsigned int newFrameSize = results.st_size;
if (newFrameSize > fMaxSize)
{
cout << "newFrameSize > fMaxSize" << endl;
fFrameSize = fMaxSize;
fNumTruncatedBytes = newFrameSize - fMaxSize;
}
else
{
cout << "fFrameSize = newFrameSize" << endl;
fFrameSize = newFrameSize;
}
unsigned char* newFrameData = (unsigned char*)malloc( fFrameSize);
fstream fbin(filename, ios::in | ios::binary);
fbin.read((char*)newFrameData, fFrameSize);
fbin.close();
memcpy(fTo,newFrameData, fFrameSize);
gettimeofday(&fPresentationTime,NULL);
fDurationInMicroseconds = 1000000 / 15; // 15 fps
FramedSource::afterGetting(this);
}
-----------------------------------------------------------------------------------------------------
More information about the live-devel
mailing list