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); }