使用audiograph api 可以播放视频中的音频,同时使用文件输出节点,就可以获取视频中的音频文件了.
关于audiograph 参考:一图理解UWP提供的音频api:AudioGraph
该功能已加入爱剪辑UWP
代码示例:
public partial class TransferPage
{
public async void TranscodeAudio()
{
try
{
if (VideoFile == null)
{
MainPage._MainPageInAppNotification.Show(AppResources.GetString("先添加视频"), 3000);
return;
}
// check folder
await App.CheckOutput();
StorageFile save_file = await MainPage.OutputFolder.CreateFileAsync(VideoFile.DisplayName + ".mp3", CreationCollisionOption.ReplaceExisting);
await CreateAudioGraph();
await CreateFileInputNode(VideoFile);
await CreateDeviceOutput();
//CreateFrameOutput();
await CreateFileOutput(save_file);
_fileInputNode.AddOutgoingConnection(_deviceOutputNode);// not nessorary
_fileInputNode.AddOutgoingConnection(_fileOutputNode);
//
_audioGraph.QuantumProcessed += async (a, b) => {
await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, async () =>
{
progress_bar.Value = _fileInputNode.Position.TotalSeconds / _fileInputNode.Duration.TotalSeconds * 100;
});
//Debug.WriteLine(_fileInputNode.Position.TotalSeconds/ _fileInputNode.Duration.TotalSeconds);
};
_fileInputNode.FileCompleted += async (a, b) => {
_audioGraph.Stop();
await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, async () =>
{
var MyFolderLauncherOptions = new FolderLauncherOptions();
//StorageFolder folder = ApplicationData.Current.LocalFolder;
await Launcher.LaunchFolderAsync(MainPage.OutputFolder, MyFolderLauncherOptions);
});
};
_fileInputNode.Start();
_audioGraph.Start();
}
catch (Exception ex)
{
MainPage._MainPageInAppNotification.Show(ex.Message);
}
}
public static AudioGraph _audioGraph;
public static AudioFileInputNode _fileInputNode;
public static AudioDeviceOutputNode _deviceOutputNode;
public static AudioFileOutputNode _fileOutputNode;
public static AudioFrameOutputNode _frameOutputNode;
//public static EqualizerEffectDefinition eqEffectDefinition;
public static async Task CreateAudioGraph()
{
if (_audioGraph != null)
{
Debug.WriteLine("AudioGraph already created no action");
return;
}
AudioGraphSettings settings = new AudioGraphSettings(Windows.Media.Render.AudioRenderCategory.Media);
//settings.QuantumSizeSelectionMode = QuantumSizeSelectionMode.LowestLatency;
// create AudioGraph
var result = await AudioGraph.CreateAsync(settings);
if (result.Status != AudioGraphCreationStatus.Success)
{
Debug.WriteLine("AudioGraph creation error: " + result.Status.ToString());
return;
}
_audioGraph = result.Graph;
//_audioGraph?.Start();
}
public static void CreateFrameOutput()
{
_frameOutputNode = _audioGraph.CreateFrameOutputNode();
}
public static async Task CreateDeviceOutput()
{
if (_deviceOutputNode != null)
{
return;
}
CreateAudioDeviceOutputNodeResult deviceOutputNodeResult = await _audioGraph.CreateDeviceOutputNodeAsync();
if (deviceOutputNodeResult.Status != AudioDeviceNodeCreationStatus.Success)
{
Debug.WriteLine("Cannot create device output node");
return;
}
_deviceOutputNode = deviceOutputNodeResult.DeviceOutputNode;
}
public static async Task CreateFileOutput(StorageFile file)
{
var result = await _audioGraph.CreateFileOutputNodeAsync(file, MediaEncodingProfile.CreateMp3(AudioEncodingQuality.High));
if (result.Status!= AudioFileNodeCreationStatus.Success)
{
Debug.WriteLine("Cannot create device output node");
return;
}
_fileOutputNode = result.FileOutputNode;
}
public static async Task CreateFileInputNode(StorageFile file)
{
if (_fileInputNode != null)
{
_fileInputNode.RemoveOutgoingConnection(_frameOutputNode);
_fileInputNode.RemoveOutgoingConnection(_deviceOutputNode);
_fileInputNode.Stop();
_fileInputNode.Reset();
}
CreateAudioFileInputNodeResult fileInputResult = await _audioGraph.CreateFileInputNodeAsync(file);
if (AudioFileNodeCreationStatus.Success != fileInputResult.Status)
{
Debug.WriteLine("Cannot read input file");
return;
}
_fileInputNode = fileInputResult.FileInputNode;
}
public static bool IsMusicTypeSupport(StorageFile file)
{
bool IsNeed = false;
switch (file.FileType)
{
case ".flac":
IsNeed = true;
break;
case ".mp3":
IsNeed = true;
break;
case ".wav":
IsNeed = true;
break;
case ".wma":
IsNeed = true;
break;
case ".m4a":
IsNeed = true;
break;
case ".aac":
IsNeed = true;
break;
case ".ac3":
IsNeed = true;
break;
default:
break;
}
return IsNeed;
}
}