void RTMPMP4Stream::onMediaFrame(MediaFrame &media) { //Depending on the media type switch (media.GetType()) { case MediaFrame::Audio: { //Create rtmp frame RTMPAudioFrame *frame = new RTMPAudioFrame(0,512); //Get audio frame AudioFrame& audio = (AudioFrame&)media; //Check codec switch(audio.GetCodec()) { case AudioCodec::PCMA: case AudioCodec::PCMU: { WORD raw[512]; DWORD rawsize = 512; //Decode audio frame DWORD rawlen = decoder->Decode(audio.GetData(),audio.GetLength(),raw,rawsize); //Encode frame DWORD len = encoder->Encode(raw,rawlen,frame->GetMediaData(),frame->GetMaxMediaSize()); //Set length frame->SetMediaSize(len); //Set type frame->SetAudioCodec(RTMPAudioFrame::SPEEX); frame->SetSoundRate(RTMPAudioFrame::RATE11khz); frame->SetSamples16Bits(1); frame->SetStereo(0); //Set timestamp frame->SetTimestamp(audio.GetTimeStamp()/8); break; } default: //Not supported return; } //Send it PlayMediaFrame(frame); } break; case MediaFrame::Video: { //Get video frame VideoFrame& video = (VideoFrame&)media; //Create rtmp frame RTMPVideoFrame *frame = new RTMPVideoFrame(video.GetTimeStamp()/90,video.GetLength()); //Check codec switch(video.GetCodec()) { case VideoCodec::H263_1996: case VideoCodec::H263_1998: #ifdef FLV1PARSER { //Create FLV1parser in case we need it flv1Parser *parser = new flv1Parser(frame->GetMediaData(),frame->GetMaxMediaSize()); //Proccess if (!parser->FrameFromH263(video.GetData(),video.GetLength())) throw new std::exception(); //Set lengtht frame->SetMediaSize(parser->GetSize()); //If it is intra if (video.IsIntra()) //Set type frame->SetFrameType(RTMPVideoFrame::INTRA); else //Set type frame->SetFrameType(RTMPVideoFrame::INTER); //Set type frame->SetVideoCodec(RTMPVideoFrame::FLV1); } #endif break; case VideoCodec::H264: { //Set Codec frame->SetVideoCodec(RTMPVideoFrame::AVC); //If it is intra if (video.IsIntra()) { //Set type frame->SetFrameType(RTMPVideoFrame::INTRA); //If we have one if (desc) { //Create the fraame RTMPVideoFrame fdesc(frame->GetTimestamp(),desc); //Play it PlayMediaFrame(&fdesc); } } else { //Set type frame->SetFrameType(RTMPVideoFrame::INTER); } //Set NALU type frame->SetAVCType(1); //Set no delay frame->SetAVCTS(0); //Set Data frame->SetVideoFrame(video.GetData(),video.GetLength()); break; } default: //Not supported return; } //Send it PlayMediaFrame(frame); //Delete it delete(frame); } break; } }