public override void Convert(AudioFrame inFrame, AudioFrame outFrame) { if (kernelCount > 1 && kernelCount != inFrame.format.Channels) { throw new ArgumentException($"{nameof(inFrame)}的数据行数和卷积核个数不一致", nameof(inFrame)); } var inFormat = inFrame.format; var inSamples = inFrame.sampleCount; var outSamples = convs[0].GetOutLength(inSamples); var outFormat = inFormat; if (resampler == null && inFormat.SampleFormat != AVSampleFormat.DoublePlanar) { outFormat = new AudioFormat(inFormat.SampleRate, inFormat.ChannelLayout, inFormat.SampleFormat.ToPlanar()); resampler = new AudioResampler(inFormat, outFormat); } if (resampler != null) { resampler.Resample(inFrame, tempInput); inFrame = tempInput; } outFrame.Resize(outFormat, outSamples); for (int i = 0; i < kernelCount; i++) { convs[kernelCount == 1 ? 0 : i].Convolve((double *)inFrame.datas[i], inSamples, (double *)outFrame.datas[i], outSamples); } }
public static void ToPlanar(AudioFrame inOutFrame) { AudioResampler resampler = GetPlanarResampler(inOutFrame.format); if (resampler == null) { return; } var samples = inOutFrame.SampleCount; int bytes = resampler.GetOutBytes(samples); packedCache.Resize(bytes); var data = packedCache.data; Buffer.MemoryCopy((void *)inOutFrame.datas[0], (void *)data, bytes, bytes); int lineBytes = resampler.Destination.GetLineBytes(samples); inOutFrame.format = resampler.Destination; inOutFrame.Resize(samples); fixed(IntPtr *input = inOutFrame.datas) { resampler.Resample((IntPtr)(&data), samples, (IntPtr)input, samples); } inOutFrame.sampleCount = samples; }
protected override void Dispose(bool disposing) { if (disposing) { resampler?.Dispose(); resampler = null; } base.Dispose(disposing); }
protected override void Dispose(bool disposing) { if (disposing) { resampler?.Dispose(); tempInput.Dispose(); if (convs != null) { Array.ForEach(convs, conv => conv.Dispose()); } resampler = null; tempInput = null; convs = null; } }
public static AudioResampler GetPlanarResampler(AudioFormat packedFormat) { if (packedFormat.IsPlanarFormat) { return(null); } if (planarResamplers.TryGetValue(packedFormat, out AudioResampler resampler)) { return(resampler); } resampler = new AudioResampler(packedFormat, packedFormat.ToPlanar()); planarResamplers.Add(packedFormat, resampler); return(resampler); }
public void PackedCopyTo(IntPtr outBuffer, int bufferBytes) { int lineBytes = format.GetLineBytes(sampleCount); if (!format.IsPlanarFormat) { Buffer.MemoryCopy((void *)cache, (void *)outBuffer, bufferBytes, lineBytes); return; } var resampler = AudioResampler.GetPackedResampler(format); fixed(IntPtr *input = datas) { resampler.Resample((IntPtr)input, SampleCount, (IntPtr)(&outBuffer), SampleCount); } }
public static AudioResampler GetPackedResampler(AudioFormat planarFormat) { if (!planarFormat.IsPlanarFormat) { return(null); } AudioResampler resampler; if (planarResamplers.TryGetValue(planarFormat, out resampler)) { return(resampler); } resampler = new AudioResampler(planarFormat, planarFormat.ToPacked()); planarResamplers.Add(planarFormat, resampler); return(resampler); }
private void Init(AVCodecID codecID, BitRate bitRate) { outFormat = MatchSupportedFormat(codecID, InFormat); if (!InFormat.Equals(OutFormat)) { resampler = new AudioResampler(InFormat, OutFormat); tempFrame = new AudioFrame(); } codecContext->SampleFmt = outFormat.SampleFormat; codecContext->SampleRate = outFormat.SampleRate; codecContext->ChannelLayout = outFormat.ChannelLayout; codecContext->Channels = outFormat.Channels; codecContext->BitRate = bitRate.Value; var rates = codecContext->Flags; int result = FF.avcodec_open2(codecContext, codec, null); if (result < 0) { throw new FFmpegException(result); } }
public static void ToPacked(AudioFrame inOutFrame) { AudioResampler resampler = GetPackedResampler(inOutFrame.format); if (resampler == null) { return; } var samples = inOutFrame.SampleCount; int bytes = resampler.GetOutBytes(samples); packedCache.Resize(bytes); var data = packedCache.data; fixed(IntPtr *input = inOutFrame.datas) { resampler.Resample((IntPtr)input, samples, (IntPtr)(&data), samples); } inOutFrame.format = resampler.Destination; inOutFrame.Update(samples, packedCache.data); }
public void ToPlanar() { AudioResampler.ToPlanar(this); }
public void ToPacked() { AudioResampler.ToPacked(this); }