Live555源代码解读(4)下


[cpp]
 view plaincopy

  1. static ServerMediaSession* createNewSMS(UsageEnvironment& env,char const* fileName, FILE/*fid*/)   

  2. {  

  3.     // Use the file name extension to determine the type of "ServerMediaSession":  

  4.     char const* extension = strrchr(fileName, '.');  

  5.     if (extension == NULL)  

  6.         return NULL;  

  7.   

  8.   

  9.     ServerMediaSession* sms = NULL;  

  10.     Boolean const reuseSource = False;  

  11.     if (strcmp(extension, ".aac") == 0) {  

  12.         // Assumed to be an AAC Audio (ADTS format) file:  

  13.         NEW_SMS("AAC Audio");  

  14.         sms->addSubsession(  

  15.                 ADTSAudioFileServerMediaSubsession::createNew(env, fileName,  

  16.                         reuseSource));  

  17.     } else if (strcmp(extension, ".amr") == 0) {  

  18.         // Assumed to be an AMR Audio file:  

  19.         NEW_SMS("AMR Audio");  

  20.         sms->addSubsession(  

  21.                 AMRAudioFileServerMediaSubsession::createNew(env, fileName,  

  22.                         reuseSource));  

  23.     } else if (strcmp(extension, ".ac3") == 0) {  

  24.         // Assumed to be an AC-3 Audio file:  

  25.         NEW_SMS("AC-3 Audio");  

  26.         sms->addSubsession(  

  27.                 AC3AudioFileServerMediaSubsession::createNew(env, fileName,  

  28.                         reuseSource));  

  29.     } else if (strcmp(extension, ".m4e") == 0) {  

  30.         // Assumed to be a MPEG-4 Video Elementary Stream file:  

  31.         NEW_SMS("MPEG-4 Video");  

  32.         sms->addSubsession(  

  33.                 MPEG4VideoFileServerMediaSubsession::createNew(env, fileName,  

  34.                         reuseSource));  

  35.     } else if (strcmp(extension, ".264") == 0) {  

  36.         // Assumed to be a H.264 Video Elementary Stream file:  

  37.         NEW_SMS("H.264 Video");  

  38.         OutPacketBuffer::maxSize = 100000; // allow for some possibly large H.264 frames  

  39.         sms->addSubsession(  

  40.                 H264VideoFileServerMediaSubsession::createNew(env, fileName,  

  41.                         reuseSource));  

  42.     } else if (strcmp(extension, ".mp3") == 0) {  

  43.         // Assumed to be a MPEG-1 or 2 Audio file:  

  44.         NEW_SMS("MPEG-1 or 2 Audio");  

  45.         // To stream using 'ADUs' rather than raw MP3 frames, uncomment the following:  

  46. //#define STREAM_USING_ADUS 1  

  47.         // To also reorder ADUs before streaming, uncomment the following:  

  48. //#define INTERLEAVE_ADUS 1  

  49.         // (For more information about ADUs and interleaving,  

  50.         //  see <http://www.live555.com/rtp-mp3/>)  

  51.         Boolean useADUs = False;  

  52.         Interleaving* interleaving = NULL;  

  53. #ifdef STREAM_USING_ADUS  

  54.         useADUs = True;  

  55. #ifdef INTERLEAVE_ADUS  

  56.         unsigned char interleaveCycle[] = {0,2,1,3}; // or choose your own...  

  57.         unsigned const interleaveCycleSize  

  58.         = (sizeof interleaveCycle)/(sizeof (unsigned char));  

  59.         interleaving = new Interleaving(interleaveCycleSize, interleaveCycle);  

  60. #endif  

  61. #endif  

  62.         sms->addSubsession(  

  63.                 MP3AudioFileServerMediaSubsession::createNew(env, fileName,  

  64.                         reuseSource, useADUs, interleaving));  

  65.     } else if (strcmp(extension, ".mpg") == 0) {  

  66.         // Assumed to be a MPEG-1 or 2 Program Stream (audio+video) file:  

  67.         NEW_SMS("MPEG-1 or 2 Program Stream");  

  68.         MPEG1or2FileServerDemux* demux = MPEG1or2FileServerDemux::createNew(env,  

  69.                 fileName, reuseSource);  

  70.         sms->addSubsession(demux->newVideoServerMediaSubsession());  

  71.         sms->addSubsession(demux->newAudioServerMediaSubsession());  

  72.     } else if (strcmp(extension, ".ts") == 0) {  

  73.         // Assumed to be a MPEG Transport Stream file:  

  74.         // Use an index file name that's the same as the TS file name, except with ".tsx":  

  75.         unsigned indexFileNameLen = strlen(fileName) + 2; // allow for trailing "x\0"  

  76.         char* indexFileName = new char[indexFileNameLen];  

  77.         sprintf(indexFileName, "%sx", fileName);  

  78.         NEW_SMS("MPEG Transport Stream");  

  79.         sms->addSubsession(  

  80.                 MPEG2TransportFileServerMediaSubsession::createNew(env,  

  81.                         fileName, indexFileName, reuseSource));  

  82.         delete[] indexFileName;  

  83.     } else if (strcmp(extension, ".wav") == 0) {  

  84.         // Assumed to be a WAV Audio file:  

  85.         NEW_SMS("WAV Audio Stream");  

  86.         // To convert 16-bit PCM data to 8-bit u-law, prior to streaming,  

  87.         // change the following to True:  

  88.         Boolean convertToULaw = False;  

  89.         sms->addSubsession(  

  90.                 WAVAudioFileServerMediaSubsession::createNew(env, fileName,  

  91.                         reuseSource, convertToULaw));  

  92.     } else if (strcmp(extension, ".dv") == 0) {  

  93.         // Assumed to be a DV Video file  

  94.         // First, make sure that the RTPSinks' buffers will be large enough to handle the huge size of DV frames (as big as 288000).  

  95.         OutPacketBuffer::maxSize = 300000;  

  96.   

  97.   

  98.         NEW_SMS("DV Video");  

  99.         sms->addSubsession(  

  100.                 DVVideoFileServerMediaSubsession::createNew(env, fileName,  

  101.                         reuseSource));  

  102.     } else if (strcmp(extension, ".mkv") == 0) {  

  103.         // Assumed to be a Matroska file  

  104.         NEW_SMS("Matroska video+audio+(optional)subtitles");  

  105.   

  106.   

  107.         // Create a Matroska file server demultiplexor for the specified file.  (We enter the event loop to wait for this to complete.)  

  108.         newMatroskaDemuxWatchVariable = 0;  

  109.         MatroskaFileServerDemux::createNew(env, fileName,  

  110.                 onMatroskaDemuxCreation, NULL);  

  111.         env.taskScheduler().doEventLoop(&newMatroskaDemuxWatchVariable);  

  112.   

  113.   

  114.         ServerMediaSubsession* smss;  

  115.         while ((smss = demux->newServerMediaSubsession()) != NULL) {  

  116.             sms->addSubsession(smss);  

  117.         }  

  118.     }  

  119.   

  120.   

  121.     return sms;  

  122. }  

可以看到NEW_SMS("AMR Audio")会创建新的ServerMediaSession,之后马上调用sms->addSubsession()为这个ServerMediaSession添加一个 ServerMediaSubSession 。看起来ServerMediaSession应该可以添加多个ServerMediaSubSession,但这里并没有这样做。如果可以添加多个 ServerMediaSubsession 那么ServerMediaSession与流名字所指定与文件是没有关系的,也就是说它不会操作文件,而文件的操作是放在 ServerMediaSubsession中的。具体应改是在ServerMediaSubsession的sdpLines()函数中打开。


转载于:https://my.oschina.net/seanx/blog/620628

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值