编辑
2025-11-22
C#
00

目录

简介
环境准备
基础知识
代码实现
1. 基础音频提取
2. 带参数控制的音频提取
进阶功能
音频流信息获取
总结

简介

在视频处理中,提取音频流是一个常见的需求。本文将详细介绍如何使用C#结合FFmpeg来实现视频音频流的提取,包括基础实现和进阶功能。

环境准备

  1. 安装FFmpeg
  2. 创建C#项目
XML
<PackageReference Include="Xabe.FFmpeg" Version="5.2.6" />

image.png

基础知识

在开始之前,需要了解几个重要概念:

  1. 音频流(Audio Stream):视频文件中的音频部分
  2. 编解码器(Codec):音频压缩/解压缩的算法
  3. 容器格式:如MP4、MKV等文件格式

代码实现

1. 基础音频提取

C#
using Xabe.FFmpeg; public class AudioExtractor { public async Task ExtractAudioAsync(string inputPath, string outputPath) { try { // 设置FFmpeg执行文件路径 FFmpeg.SetExecutablesPath(@"D:\Software\ffmpeg-master-latest-win64-gpl-shared\bin\"); // 获取媒体信息 IMediaInfo mediaInfo = await FFmpeg.GetMediaInfo(inputPath); // 转换配置 IStream audioStream = mediaInfo.AudioStreams.FirstOrDefault(); if (audioStream == null) { throw new Exception("No audio stream found in the video file."); } // 创建转换任务 var conversion = FFmpeg.Conversions.New() .AddStream(audioStream) .SetOutput(outputPath); // 添加进度报告 conversion.OnProgress += (sender, args) => { var percent = (int)(Math.Round(args.Duration.TotalSeconds / args.TotalLength.TotalSeconds, 2) * 100); Console.WriteLine($"Progress: {percent}%"); }; // 执行转换 await conversion.Start(); Console.WriteLine("Audio extraction completed successfully!"); } catch (Exception ex) { Console.WriteLine($"Error during audio extraction: {ex.Message}"); throw; } } }
C#
static async Task Main(string[] args) { AudioExtractor extractor = new AudioExtractor(); await extractor.ExtractAudioAsync("D:\\Video\\1.mp4", "D:\\output.mp3"); }

image.png

2. 带参数控制的音频提取

C#
public class AdvancedAudioExtractor { public async Task ExtractAudioWithOptionsAsync( string inputPath, string outputPath, AudioFormat format = AudioFormat.mp3, int bitrate = 192, int sampleRate = 44100) { try { FFmpeg.SetExecutablesPath(@"D:\Software\ffmpeg-master-latest-win64-gpl-shared\bin\"); var mediaInfo = await FFmpeg.GetMediaInfo(inputPath); var audioStream = mediaInfo.AudioStreams.FirstOrDefault(); if (audioStream == null) { throw new Exception("No audio stream found."); } // 配置音频参数 var conversion = FFmpeg.Conversions.New() .AddStream(audioStream) .SetAudioBitrate(bitrate * 1000) // 转换为bps .SetOutput(outputPath); // 进度报告 conversion.OnProgress += (sender, args) => { var percent = (int)(Math.Round(args.Duration.TotalSeconds / args.TotalLength.TotalSeconds, 2) * 100); Console.WriteLine($"Progress: {percent}%"); }; await conversion.Start(); } catch (Exception ex) { Console.WriteLine($"Error: {ex.Message}"); throw; } } } public enum AudioFormat { mp3, aac, wav, flac }
C#
static async Task Main(string[] args) { AdvancedAudioExtractor extractor = new AdvancedAudioExtractor(); await extractor.ExtractAudioWithOptionsAsync("D:\\Video\\1.mp4", "D:\\output.mp3"); }

image.png

进阶功能

音频流信息获取

C#
public class AudioStreamInfo { public async Task DisplayAudioInfo(string filePath) { // 设置FFmpeg执行文件路径 FFmpeg.SetExecutablesPath(@"D:\Software\ffmpeg-master-latest-win64-gpl-shared\bin\"); var mediaInfo = await FFmpeg.GetMediaInfo(filePath); var audioStream = mediaInfo.AudioStreams.FirstOrDefault(); if (audioStream != null) { Console.WriteLine($"Audio Information for: {Path.GetFileName(filePath)}"); Console.WriteLine($"Codec: {audioStream.Codec}"); Console.WriteLine($"Channel(s): {audioStream.Channels}"); Console.WriteLine($"Sample Rate: {audioStream.SampleRate}Hz"); Console.WriteLine($"Bitrate: {audioStream.Bitrate / 1000}kbps"); Console.WriteLine($"Duration: {audioStream.Duration}"); } else { Console.WriteLine("No audio stream found."); } } }

image.png

总结

本文详细介绍了如何使用C#和FFmpeg实现视频音频流提取,从基础实现到进阶功能都有完整的代码示例。在实际应用中,可以根据具体需求选择合适的实现方式,并注意进行适当的错误处理和性能优化。

本文作者:技术老小子

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!