Browse Source

merge

pull/714/head
Mark Heath 3 years ago
parent
commit
5449b95ffe
  1. 59
      NAudio.Wasapi/MediaFoundationEncoder.cs
  2. 10
      NAudio.sln
  3. 12
      NAudioWpfDemo/MediaFoundationEncode/MediaFoundationEncodeViewModel.cs

59
NAudio.Wasapi/MediaFoundationEncoder.cs

@ -57,13 +57,11 @@ namespace NAudio.Wave
throw; throw;
} }
} }
int count;
availableTypes.GetElementCount(out count);
availableTypes.GetElementCount(out int count);
var mediaTypes = new List<MediaType>(count); var mediaTypes = new List<MediaType>(count);
for (int n = 0; n < count; n++) for (int n = 0; n < count; n++)
{ {
object mediaTypeObject;
availableTypes.GetElement(n, out mediaTypeObject);
availableTypes.GetElement(n, out object mediaTypeObject);
var mediaType = (IMFMediaType)mediaTypeObject; var mediaType = (IMFMediaType)mediaTypeObject;
mediaTypes.Add(new MediaType(mediaType)); mediaTypes.Add(new MediaType(mediaType));
} }
@ -222,8 +220,7 @@ namespace NAudio.Wave
var writer = CreateSinkWriter(outputFile); var writer = CreateSinkWriter(outputFile);
try try
{ {
int streamIndex;
writer.AddStream(outputMediaType.MediaFoundationObject, out streamIndex);
writer.AddStream(outputMediaType.MediaFoundationObject, out int streamIndex);
// n.b. can get 0xC00D36B4 - MF_E_INVALIDMEDIATYPE here // n.b. can get 0xC00D36B4 - MF_E_INVALIDMEDIATYPE here
writer.SetInputMediaType(streamIndex, inputMediaType.MediaFoundationObject, null); writer.SetInputMediaType(streamIndex, inputMediaType.MediaFoundationObject, null);
@ -232,8 +229,14 @@ namespace NAudio.Wave
} }
finally finally
{ {
Marshal.ReleaseComObject(writer);
Marshal.ReleaseComObject(inputMediaType.MediaFoundationObject);
if (writer != null)
{
Marshal.ReleaseComObject(writer);
}
if (inputMediaType.MediaFoundationObject != null)
{
Marshal.ReleaseComObject(inputMediaType.MediaFoundationObject);
}
} }
} }
@ -243,24 +246,35 @@ namespace NAudio.Wave
/// <param name="outputStream">Output stream</param> /// <param name="outputStream">Output stream</param>
/// <param name="inputProvider">Input provider (should be PCM, some encoders will also allow IEEE float)</param> /// <param name="inputProvider">Input provider (should be PCM, some encoders will also allow IEEE float)</param>
/// <param name="transcodeContainerType">One of <see cref="TranscodeContainerTypes"/></param> /// <param name="transcodeContainerType">One of <see cref="TranscodeContainerTypes"/></param>
public void Encode(Stream outputStream, IWaveProvider inputProvider, Guid transcodeContainerType) {
if (inputProvider.WaveFormat.Encoding != WaveFormatEncoding.Pcm && inputProvider.WaveFormat.Encoding != WaveFormatEncoding.IeeeFloat) {
public void Encode(Stream outputStream, IWaveProvider inputProvider, Guid transcodeContainerType)
{
if (inputProvider.WaveFormat.Encoding != WaveFormatEncoding.Pcm && inputProvider.WaveFormat.Encoding != WaveFormatEncoding.IeeeFloat)
{
throw new ArgumentException("Encode input format must be PCM or IEEE float"); throw new ArgumentException("Encode input format must be PCM or IEEE float");
} }
var inputMediaType = new MediaType(inputProvider.WaveFormat); var inputMediaType = new MediaType(inputProvider.WaveFormat);
var writer = CreateSinkWriter(new ComStream(outputStream), transcodeContainerType); var writer = CreateSinkWriter(new ComStream(outputStream), transcodeContainerType);
try {
try
{
writer.AddStream(outputMediaType.MediaFoundationObject, out int streamIndex); writer.AddStream(outputMediaType.MediaFoundationObject, out int streamIndex);
// n.b. can get 0xC00D36B4 - MF_E_INVALIDMEDIATYPE here // n.b. can get 0xC00D36B4 - MF_E_INVALIDMEDIATYPE here
writer.SetInputMediaType(streamIndex, inputMediaType.MediaFoundationObject, null); writer.SetInputMediaType(streamIndex, inputMediaType.MediaFoundationObject, null);
PerformEncode(writer, streamIndex, inputProvider); PerformEncode(writer, streamIndex, inputProvider);
} finally {
Marshal.ReleaseComObject(writer);
Marshal.ReleaseComObject(inputMediaType.MediaFoundationObject);
}
finally
{
if (writer != null)
{
Marshal.ReleaseComObject(writer);
}
if (inputMediaType.MediaFoundationObject != null)
{
Marshal.ReleaseComObject(inputMediaType.MediaFoundationObject);
}
} }
} }
@ -292,7 +306,8 @@ namespace NAudio.Wave
return writer; return writer;
} }
private static IMFSinkWriter CreateSinkWriter(IStream outputStream, Guid TranscodeContainerType) {
private static IMFSinkWriter CreateSinkWriter(IStream outputStream, Guid TranscodeContainerType)
{
// n.b. could try specifying the container type using attributes, but I think // n.b. could try specifying the container type using attributes, but I think
// it does a decent job of working it out from the file extension // it does a decent job of working it out from the file extension
// n.b. AAC encode on Win 8 can have AAC extension, but use MP4 in win 7 // n.b. AAC encode on Win 8 can have AAC extension, but use MP4 in win 7
@ -300,10 +315,13 @@ namespace NAudio.Wave
IMFSinkWriter writer; IMFSinkWriter writer;
var attributes = MediaFoundationApi.CreateAttributes(1); var attributes = MediaFoundationApi.CreateAttributes(1);
attributes.SetGUID(MediaFoundationAttributes.MF_TRANSCODE_CONTAINERTYPE, TranscodeContainerType); attributes.SetGUID(MediaFoundationAttributes.MF_TRANSCODE_CONTAINERTYPE, TranscodeContainerType);
try {
try
{
MediaFoundationInterop.MFCreateMFByteStreamOnStream(outputStream, out var ppByteStream); MediaFoundationInterop.MFCreateMFByteStreamOnStream(outputStream, out var ppByteStream);
MediaFoundationInterop.MFCreateSinkWriterFromURL(null, ppByteStream, attributes, out writer); MediaFoundationInterop.MFCreateSinkWriterFromURL(null, ppByteStream, attributes, out writer);
} finally {
}
finally
{
Marshal.ReleaseComObject(attributes); Marshal.ReleaseComObject(attributes);
} }
return writer; return writer;
@ -336,16 +354,13 @@ namespace NAudio.Wave
private long ConvertOneBuffer(IMFSinkWriter writer, int streamIndex, IWaveProvider inputProvider, long position, byte[] managedBuffer) private long ConvertOneBuffer(IMFSinkWriter writer, int streamIndex, IWaveProvider inputProvider, long position, byte[] managedBuffer)
{ {
long durationConverted = 0; long durationConverted = 0;
int maxLength;
IMFMediaBuffer buffer = MediaFoundationApi.CreateMemoryBuffer(managedBuffer.Length); IMFMediaBuffer buffer = MediaFoundationApi.CreateMemoryBuffer(managedBuffer.Length);
buffer.GetMaxLength(out maxLength);
buffer.GetMaxLength(out var maxLength);
IMFSample sample = MediaFoundationApi.CreateSample(); IMFSample sample = MediaFoundationApi.CreateSample();
sample.AddBuffer(buffer); sample.AddBuffer(buffer);
IntPtr ptr;
int currentLength;
buffer.Lock(out ptr, out maxLength, out currentLength);
buffer.Lock(out var ptr, out maxLength, out int currentLength);
int read = inputProvider.Read(managedBuffer, 0, maxLength); int read = inputProvider.Read(managedBuffer, 0, maxLength);
if (read > 0) if (read > 0)
{ {

10
NAudio.sln

@ -1,19 +1,19 @@
 
Microsoft Visual Studio Solution File, Format Version 12.00 Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.30717.126
# Visual Studio Version 17
VisualStudioVersion = 17.2.32602.215
MinimumVisualStudioVersion = 10.0.40219.1 MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NAudio", "NAudio\NAudio.csproj", "{DA4F02E3-0B5E-42CD-B8D9-5583FA51D66E}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NAudio", "NAudio\NAudio.csproj", "{DA4F02E3-0B5E-42CD-B8D9-5583FA51D66E}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MidiFileConverter", "MidiFileConverter\MidiFileConverter.csproj", "{5B5897BD-A423-4AF8-8A59-1C1372ED77DB}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MidiFileConverter", "MidiFileConverter\MidiFileConverter.csproj", "{5B5897BD-A423-4AF8-8A59-1C1372ED77DB}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MixDiff", "MixDiff\MixDiff.csproj", "{1293DD10-378A-4370-AEE2-AA1E9E87039B}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MixDiff", "MixDiff\MixDiff.csproj", "{1293DD10-378A-4370-AEE2-AA1E9E87039B}"
EndProject EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NAudioTests", "NAudioTests\NAudioTests.csproj", "{5080281A-F9A1-403F-85C7-0DFF6839B07B}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NAudioTests", "NAudioTests\NAudioTests.csproj", "{5080281A-F9A1-403F-85C7-0DFF6839B07B}"
EndProject EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NAudioDemo", "NAudioDemo\NAudioDemo.csproj", "{C37A547B-F31E-45FB-870A-CFA704D06152}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NAudioDemo", "NAudioDemo\NAudioDemo.csproj", "{C37A547B-F31E-45FB-870A-CFA704D06152}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AudioFileInspector", "AudioFileInspector\AudioFileInspector.csproj", "{D29C1659-635C-497B-847E-FE9A5A69ED03}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AudioFileInspector", "AudioFileInspector\AudioFileInspector.csproj", "{D29C1659-635C-497B-847E-FE9A5A69ED03}"
EndProject EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NAudioWpfDemo", "NAudioWpfDemo\NAudioWpfDemo.csproj", "{A7B74F85-D353-4ED4-A321-E6E4AD4D7D32}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NAudioWpfDemo", "NAudioWpfDemo\NAudioWpfDemo.csproj", "{A7B74F85-D353-4ED4-A321-E6E4AD4D7D32}"
EndProject EndProject

12
NAudioWpfDemo/MediaFoundationEncode/MediaFoundationEncodeViewModel.cs

@ -176,7 +176,7 @@ namespace NAudioWpfDemo.MediaFoundationEncode
private void Encode() private void Encode()
{ {
if (string.IsNullOrEmpty(InputFile)||!File.Exists(InputFile))
if (String.IsNullOrEmpty(InputFile) || !File.Exists(InputFile))
{ {
MessageBox.Show("Please select a valid input file to convert"); MessageBox.Show("Please select a valid input file to convert");
return; return;
@ -193,7 +193,15 @@ namespace NAudioWpfDemo.MediaFoundationEncode
if (outputUrl == null) return; if (outputUrl == null) return;
using (var encoder = new MediaFoundationEncoder(SelectedMediaType.MediaType)) using (var encoder = new MediaFoundationEncoder(SelectedMediaType.MediaType))
{ {
encoder.Encode(outputUrl, reader);
try
{
encoder.Encode(outputUrl, reader);
}
catch (Exception e)
{
MessageBox.Show(e.Message, "Failed to encode");
}
} }
} }
} }

Loading…
Cancel
Save