コード例 #1
0
        protected override void GetSampleAsync(MediaStreamType eMediaStreamType)
        {
            Dictionary <MediaSampleAttributeKeys, string> emptyDict = new Dictionary <MediaSampleAttributeKeys, string>();
            MediaStreamSample cMediaStreamSample = null;
            NALUnit           cNALUnit           = null;

            lock (_cSyncRoot)
            {
                if (!_bCached && _nCurrentFrameVideo >= _nFramesBuffered)
                {
                    this.ReportGetSampleProgress(0);
                    if (MediaStreamType.Audio == eMediaStreamType)
                    {
                        _bAudioFrameNeeded = true;
                    }
                    else
                    {
                        _bVideoFrameNeeded = true;
                    }
                    return;
                }
                if (MediaStreamType.Audio == eMediaStreamType)
                {
                    _bAudioFrameNeeded = false;
                }
                else
                {
                    _bVideoFrameNeeded = false;
                }
            }
            if (eMediaStreamType == MediaStreamType.Audio)
            {
                try
                {
                    lock (_cSyncRoot)
                    {
                        if (0 < _aAudioNALs.Count && _aAudioNALs.Count > _nFrameOffsetAudio)
                        {
                            cNALUnit = _aAudioNALs[_nFrameOffsetAudio++];
                        }
                    }
                    if (null != cNALUnit)
                    {
                        cMediaStreamSample = new MediaStreamSample(_cMediaStreamAudioDescription, new MemoryStream(_cStream.Read(cNALUnit.nStart, cNALUnit.nBytesQty)), 0, cNALUnit.nBytesQty, (long)(_nCurrentFrameAudio * _nSampleDuration), emptyDict);                         //(long)(_nCurrentFrameAudio * _nSampleDuration)
                        _nCurrentFrameAudio++;
                    }
                }
                catch { }
                if (null == cMediaStreamSample)
                {
                    cMediaStreamSample = new MediaStreamSample(_cMediaStreamAudioDescription, null, 0, 0, 0, emptyDict);
                }
            }
            else
            {
                try
                {
                    lock (_cSyncRoot)
                        if (0 < _aVideoNALs.Count && _aVideoNALs.Count > _nFrameOffsetVideo)
                        {
                            cNALUnit = _aVideoNALs[_nFrameOffsetVideo++];
                        }
                    if (null != cNALUnit)
                    {
                        cMediaStreamSample = new MediaStreamSample(_cMediaStreamVideoDescription, new MemoryStream(_cStream.Read(cNALUnit.nStart, cNALUnit.nBytesQty)), 0, cNALUnit.nBytesQty, (long)(_nCurrentFrameVideo * _nFrameDuration), emptyDict);                         //(long)(_nCurrentFrameVideo * _nFrameDuration)
                    }
                    if (null == cNALUnit || cNALUnit.bFrameStart)
                    {
                        _nCurrentFrameVideo++;
                    }
                }
                catch { }
                if (null == cMediaStreamSample)
                {
                    cMediaStreamSample = new MediaStreamSample(_cMediaStreamVideoDescription, null, 0, 0, 0, emptyDict);
                }
            }
            this.ReportGetSampleCompleted(cMediaStreamSample);
        }