At 2011-10-14 12:34:56,"Ross Finlayson" <finlay...@live555.com> wrote:
No, unfortunately there's no general 'frame duplicator' mechanism in our library. Now, I known I can use a FileSink for save the media data to file. RTPSource -> FileSink But, how to send to the live player simultaneously? Should I make a Filter class, so the chain becomes: RTPSource -> Filter -> RTPSink(to player) Yes, the simplest thing to do here would be to write your own filter class (a subclass of "FramedFilter") that copies input frames to the output, but also writes them to a file. The "writing to a file" would be done directly (i.e., using "fwrite()"), rather than using a "FileSink"). If I should do so, how about send to 2 and more live player The simplest way to do this is just to use multicast. I.e., send the frames out just once (using a single "RTPSink" object, but do so using an IP multicast address). (E.g., our "testRelay" demo application does something like this.) Ross Finlayson Live Networks, Inc. http://www.live555.com/ Thank you for your reply! I just wrote a simple Filter class: =========================================================== H264VideoFilter::H264VideoFilter(UsageEnvironment& env, H264VideoRTPSource* source, char* saveToFileName) : FramedSource(env) { this->source = source; this->saveToFileName = saveToFileName; fileToSave = fopen(saveToFileName, "rw"); } H264VideoFilter::~H264VideoFilter() { if (fileToSave != NULL) { fclose(fileToSave); } } void H264VideoFilter::onCloseCallback(void *clientData) { H264VideoFilter* filter = (H264VideoFilter*) clientData; if (filter->fileToSave != NULL) { fclose(filter->fileToSave); filter->fileToSave = NULL; } } void H264VideoFilter::afterGettingCallback(void *clientData, unsigned frameSize, unsigned numTruncatedBytes, struct timeval presentationTime, unsigned durationInMicroseconds) { H264VideoFilter* source = (H264VideoFilter*) clientData; /* save the frame to file */ fwrite((void*)source->fTo, (size_t)frameSize, 1, source->fileToSave); FramedSource::afterGetting(source); } void H264VideoFilter::doGetNextFrame() { source->getNextFrame(fTo, fMaxSize, &afterGettingCallback, this, &onCloseCallback, this); } =========================================================== Now, I can use this filter as the source of my custom subsession object, then pass True as reuseFirstSource argument of the subsession constructor, so I can just use one filter to serve multiple remote player, right?
_______________________________________________ live-devel mailing list live-devel@lists.live555.com http://lists.live555.com/mailman/listinfo/live-devel