Skip to content

Commit

Permalink
feat: direct audio proxy file writing
Browse files Browse the repository at this point in the history
When generating an audio proxy file for an FFmpeg stream, it was first fully decoded and stored in memory before it was written to a file. This was an inefficient waste of memory resources, and proxy files were limited to a size of 2 GiB due to a limitation of .NET's `MemoryStream`. With this change, the files are written directly. They are now limited to 4 GiB due to a limitation of NAudio's `WaveFileWriter`.
  • Loading branch information
protyposis committed Jan 26, 2024
1 parent 6a99a85 commit 0e1779c
Showing 1 changed file with 16 additions and 17 deletions.
33 changes: 16 additions & 17 deletions src/Aurio.FFmpeg/FFmpegSourceStream.cs
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
using System.IO;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
using Aurio.Streams;

namespace Aurio.FFmpeg
Expand Down Expand Up @@ -301,17 +302,20 @@ public static FileInfo CreateWaveProxy(FileInfo fileInfo, FileInfo proxyFileInfo
}

var reader = new FFmpegReader(fileInfo, FFmpeg.Type.Audio);

var writer = new MemoryWriterStream(
new AudioProperties(
reader.AudioOutputConfig.format.channels,
reader.AudioOutputConfig.format.sample_rate,
reader.AudioOutputConfig.format.sample_size * 8,
reader.AudioOutputConfig.format.sample_size == 4
? AudioFormat.IEEE
: AudioFormat.LPCM
)
var properties = new AudioProperties(
reader.AudioOutputConfig.format.channels,
reader.AudioOutputConfig.format.sample_rate,
reader.AudioOutputConfig.format.sample_size * 8,
reader.AudioOutputConfig.format.sample_size == 4
? AudioFormat.IEEE
: AudioFormat.LPCM
);
var writer = new BlockingFixedLengthFifoStream(properties, 1024 * 1024 * 16);

var writerTask = Task.Run(() =>
{
AudioStreamFactory.WriteToFile(writer, proxyFileInfo.FullName);
});

int output_buffer_size = reader.AudioOutputConfig.frame_size * writer.SampleBlockSize;
byte[] output_buffer = new byte[output_buffer_size];
Expand All @@ -334,13 +338,8 @@ out Type type
writer.Write(output_buffer, 0, bytesRead);
}

reader.Dispose();

writer.Position = 0;

AudioStreamFactory.WriteToFile(writer, proxyFileInfo.FullName);

writer.Close();
writer.SignalEndOfInput();
writerTask.Wait();

return proxyFileInfo;
}
Expand Down

0 comments on commit 0e1779c

Please sign in to comment.