コード例 #1
0
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;
	}
}