mirror of
https://github.com/rosenbjerg/FFMpegCore.git
synced 2024-11-10 08:34:12 +01:00
Add simple support for PCM audio source wrapping
Former-commit-id: d8810682ef
This commit is contained in:
parent
7bee36e2ca
commit
32dfb34724
3 changed files with 88 additions and 0 deletions
27
FFMpegCore/Extend/PcmAudioSampleWrapper.cs
Normal file
27
FFMpegCore/Extend/PcmAudioSampleWrapper.cs
Normal file
|
@ -0,0 +1,27 @@
|
|||
using FFMpegCore.Pipes;
|
||||
using System.IO;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
public class PcmAudioSampleWrapper : IAudioSample
|
||||
{
|
||||
//This could actually be short or int, but copies would be inefficient.
|
||||
//Handling bytes lets the user decide on the conversion, and abstract the library
|
||||
//from handling shorts, unsigned shorts, integers, unsigned integers and floats.
|
||||
private readonly byte[] _sample;
|
||||
|
||||
public PcmAudioSampleWrapper(byte[] sample)
|
||||
{
|
||||
_sample = sample;
|
||||
}
|
||||
|
||||
public void Serialize(Stream stream)
|
||||
{
|
||||
stream.Write(_sample, 0, _sample.Length);
|
||||
}
|
||||
|
||||
public async Task SerializeAsync(Stream stream, CancellationToken token)
|
||||
{
|
||||
await stream.WriteAsync(_sample, 0, _sample.Length, token);
|
||||
}
|
||||
}
|
16
FFMpegCore/FFMpeg/Pipes/IAudioSample.cs
Normal file
16
FFMpegCore/FFMpeg/Pipes/IAudioSample.cs
Normal file
|
@ -0,0 +1,16 @@
|
|||
using System.IO;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace FFMpegCore.Pipes
|
||||
{
|
||||
/// <summary>
|
||||
/// Interface for Audio sample
|
||||
/// </summary>
|
||||
public interface IAudioSample
|
||||
{
|
||||
void Serialize(Stream stream);
|
||||
|
||||
Task SerializeAsync(Stream stream, CancellationToken token);
|
||||
}
|
||||
}
|
45
FFMpegCore/FFMpeg/Pipes/RawAudioPipeSource.cs
Normal file
45
FFMpegCore/FFMpeg/Pipes/RawAudioPipeSource.cs
Normal file
|
@ -0,0 +1,45 @@
|
|||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace FFMpegCore.Pipes
|
||||
{
|
||||
/// <summary>
|
||||
/// Implementation of <see cref="IPipeSource"/> for a raw audio stream that is gathered from <see cref="IEnumerator{IAudioFrame}"/>
|
||||
/// </summary>
|
||||
public class RawAudioPipeSource : IPipeSource
|
||||
{
|
||||
private readonly IEnumerator<IAudioSample> _sampleEnumerator;
|
||||
|
||||
public string Format { get; set; } = "s16le";
|
||||
public uint SampleRate { get; set; } = 8000;
|
||||
public uint Channels { get; set; } = 1;
|
||||
|
||||
public RawAudioPipeSource(IEnumerator<IAudioSample> sampleEnumerator)
|
||||
{
|
||||
_sampleEnumerator = sampleEnumerator;
|
||||
}
|
||||
|
||||
public RawAudioPipeSource(IEnumerable<IAudioSample> sampleEnumerator)
|
||||
: this(sampleEnumerator.GetEnumerator()) { }
|
||||
|
||||
public string GetStreamArguments()
|
||||
{
|
||||
return $"-f {Format} -ar {SampleRate} -ac {Channels}";
|
||||
}
|
||||
|
||||
public async Task WriteAsync(Stream outputStream, CancellationToken cancellationToken)
|
||||
{
|
||||
if (_sampleEnumerator.Current != null)
|
||||
{
|
||||
await _sampleEnumerator.Current.SerializeAsync(outputStream, cancellationToken).ConfigureAwait(false);
|
||||
}
|
||||
|
||||
while (_sampleEnumerator.MoveNext())
|
||||
{
|
||||
await _sampleEnumerator.Current!.SerializeAsync(outputStream, cancellationToken).ConfigureAwait(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue