1

I need to play AAC LC audio that comes from live stream. To achive that i've implemented MediaStreamSource.

When i receive first packets of stream, i set MediaElement's source to my MediaStreamSource. It seems that everything works fine: OpenMediaAsync is called -> reported with ReportOpenMediaCompleted, then GetSampleAsync is called -> reported with ReportGetSampleCompleted, BUT, on 10th call of GetSampleAsync, ReportGetSampleCompleted is throws NullReferenceException.

Here is my CodecPrivateData:

var waveFormat = new AACWaveFormat();
waveFormat.FormatTag = 0xFF;
waveFormat.Channels = 2; // For my stream is always stereo
waveFormat.Frequency = 44100; //For my stream is always 44Khz
waveFormat.BitsPerSample = 16;  //For my stream is always 16bit
waveFormat.BlockAlign = waveFormat.Channels * waveFormat.BitsPerSample / 8; //is this true formula?
waveFormat.AverageBytesPerSecond = waveFormat.Frequency * waveFormat.BlockAlign; //is this true formula?  because usually this value is 176400 or 1411Kbps is this real value for sound?
waveFormat.ExtraDataSize = 2; //usually, but i read these values from first packet of stream
waveFormat.ExtraData = AudioSpecificConfig; //AudioSpecificConfig usually 2 bytes length, readed from stream.

First packet of the stream is always AACSequenceHeader - where i read my CodecPrivateData and AudioSpecificConfig. All the rest is AACRaw.

My CodecPrivateData is looks like FF00020044AC000010B102000400100002001210.

My GetSampleAsync

protected override void GetSampleAsync(MediaStreamType mediaStreamType)
{
    var audioStreamDescription = new MediaStreamDescription(MediaStreamType.Audio, AudioStreamAttibutes);  //AudioStreamAttibutes is field that contains data filled on OpenMediaAsync step.
    //using (var memoryStream = new MemoryStream(AudioPackets[0].Data))
    var memoryStream = new MemoryStream(AudioPackets[0].Data);
    ReportGetSampleCompleted(new MediaStreamSample(audioStreamDescription, memoryStream, 0, AudioPackets[0].Data.Length, TimeSpan.FromMilliseconds(GetAudioSampleCalls++ * 32).Ticks, new Dictionary<MediaSampleAttributeKeys, String>()));  //throws NullReferenceException, when debugger stops i can be see that all passed params is not null!
}

The problem here is that i don't know any timestamp and i don't know whether this could be a problem.

And finally what is Data field? Data field contains all received RawAAC audio as Byte[] that i extract from AudioTag. (See E.4.2.2 AACAUDIODATA at http://download.macromedia.com/f4v/video_file_format_spec_v10_1.pdf)

Master
  • 11
  • 2
  • Update: I've returned to this project and i've found that my AAC stream is playing well only when it playing alone, without video stream. Video stream is playing very well too, and only when it playing alone. Both, they throw that annoing NullReferenceException and GetSampleAsync never invoked after. – Master Aug 23 '13 at 12:25

0 Answers0