private void OnFrameReceived(object sender, RawFrame rawFrame) { if (!(rawFrame is RawAudioFrame rawAudioFrame)) { return; } FFmpegAudioDecoder decoder = GetDecoderForFrame(rawAudioFrame); if (!decoder.TryDecode(rawAudioFrame, out int decodedFrameSize)) { return; } if (_decodedFrameBuffer.Length < decodedFrameSize) { _decodedFrameBuffer = new byte[decodedFrameSize]; } var bufferSegment = new ArraySegment <byte>(_decodedFrameBuffer, 0, decodedFrameSize); IDecodedAudioFrame decodedFrame = decoder.GetDecodedFrame(bufferSegment); FrameReceived?.Invoke(this, decodedFrame); }
//convert the raw frame to decoded frame private void RtspClientOnFrameReceived(object sender, RawFrame rawFrame) { if (!(rawFrame is RawAudioFrame rawAudioFrame)) { return; } FFmpegAudioDecoder decoder = GetDecoderForFrame(rawAudioFrame); if (!decoder.TryDecode(rawAudioFrame)) { return; } //OutBitsPerSample may need to be set by user or the program? IDecodedAudioFrame decodedFrame = decoder.GetDecodedFrame(new AudioConversionParameters() { OutBitsPerSample = 16 }); System.Windows.Application.Current.Dispatcher.Invoke(_invalidateAction, DispatcherPriority.Send, decodedFrame); }
private void OnFrameReceived(object sender, RawFrame rawFrame) { if (!(rawFrame is RawAudioFrame rawAudioFrame)) { return; } FFmpegAudioDecoder decoder = GetDecoderForFrame(rawAudioFrame); if (!decoder.TryDecode(rawAudioFrame)) { return; } IDecodedAudioFrame decodedFrame = decoder.GetDecodedFrame(new AudioConversionParameters() { OutBitsPerSample = 16 }); FrameReceived?.Invoke(this, decodedFrame); }
//convert decodedAudioFrame to wave and sound private void Invalidate(IDecodedAudioFrame decodedAudioFrame) { frames++; audioSeriesData.Clear(); audioSeriesDataPart.Clear(); int len = decodedAudioFrame.DecodedBytes.Count; int singleLen = decodedAudioFrame.Format.BitPerSample / 8; // convert the pcm data to ArrayList, each element in the array represents a sample if (decodedAudioFrame.Format.BitPerSample == 16) { for (int i = 0; i < len; i = i + singleLen) { //only consider the bitPerSample == 16 int audioData = 0; if (decodedAudioFrame.Format.Channels != 1) { audioData = (decodedAudioFrame.DecodedBytes.Array[i] * 255 + decodedAudioFrame.DecodedBytes.Array[i + 1] + decodedAudioFrame.DecodedBytes.Array[i + 2] * 255 + decodedAudioFrame.DecodedBytes.Array[i + 3]) / 2; i = i + singleLen; } else { audioData = decodedAudioFrame.DecodedBytes.Array[i] * 255 + decodedAudioFrame.DecodedBytes.Array[i + 1]; } audioSeriesData.Add(audioData); if (i < maxPointsInChart) { audioSeriesDataPart.Add(audioData); } } } else if (decodedAudioFrame.Format.BitPerSample == 8) { for (int i = 0; i < len; i = i + singleLen) { int audioData = 0; if (decodedAudioFrame.Format.Channels != 1) { audioData = (decodedAudioFrame.DecodedBytes.Array[i] + decodedAudioFrame.DecodedBytes.Array[i + 1]) / 2; i = i + singleLen; } else { audioData = decodedAudioFrame.DecodedBytes.Array[i]; } audioSeriesData.Add(audioData); if (i < maxPointsInChart) { audioSeriesDataPart.Add(audioData); } } } //only one in several frames will be shown in the chart int fps = System.Math.Abs(decodedAudioFrame.Format.BytesPerSecond / len); if (frames % (fps / fpsChart) == 0) { DrawChart(); } if (audioPlayer.WaveFormat == null) { audioPlayer.SetPcmPlayer(decodedAudioFrame.Format.SampleRate, decodedAudioFrame.Format.BitPerSample, decodedAudioFrame.Format.Channels); } audioPlayer.PlayData(decodedAudioFrame.DecodedBytes.Array); return; }