基于C#的FFmpeg音视频编解码学习

本文介绍如何使用FFmpeg.AutoGen库在C#环境中搭建音视频处理项目,包括项目搭建步骤、FFmpeg库注册及初始化过程。适用于C#开发者快速上手音视频处理。

 一、前言  

        近两年项目上需要用到音视频的编解码,实现RTSP的拉流实时播放,同时采集本地麦克风音频数据实时下发到对端,实现双端的音视频通话,当时查阅搜索了较多资料,决定使用FFmpeg,主要还是参考雷神的博客,像雷神致敬,感谢雷神为我们这些小白提供了学习渠道。

        网上的资料都是基于C++的,而我的项目是基于C#的,由于项目紧急,便使用C++编写了音视频处理代码,封装成动态链接库供C#调用,最终调试稳定后上线应用。

        最近项目闲暇,在混迹优快云时无意间发现FFMpeg.AutoGen这个程序集,这个程序集是将FFmpeg的接口全部封装成C#接口,方便C#直接调用FFmpeg,这对C#编程人员来说真的是一大福音。

        本着共同学习,共同进步的态度,同时也能为自己学习的历程做一个记录,笔者决定将自己学习关于FFMpeg.AutoGen的使用,以及编解码流程等在这里记录下来,FFmpeg函数相关不做主要介绍,C++里已经很全了,随处可搜索到,文章只介绍FFmpeg在C#中是如何使用的,以及使用它来实现一些功能,编译环境使用:VS2019。

        本文章只适合小白学习,大神请绕路。

        不喜勿喷!

———————————————————————————————————————————

        笔者预计从以下几个文章来记录:

        1、FFMpeg.AutoGen项目搭建(WPF项目)

        2、基于FFMpeg.AutoGen的RTSP拉流

        3、基于FFMpeg.AutoGen+SDL2的RTSP拉流播放

        4、基于FFMpeg.AutoGen的麦克风采集

        5、基于FFMpeg.AutoGen的RTSP拉流保存MP4

        6、基于FFMpeg.AutoGen的麦克风采集保存MP3

        7、基于FFmpeg命令行的MP4+MP3混音

        8、基于FFmpeg.AutoGen库的MP4+MP3混音

        9、整体项目:RTSP拉流实时播放、麦克风采集发送、RTSP+PCM流保存MP3

———————————————————————————————————————————

二、FFMpeg.AutoGen项目搭建(WPF项目)

创建名为FFmpegAutoGenDemo的WPF项目,打开NuGet包管理器,输入FFmpeg.AutoGen查找,选择第一个安装到程序里,笔者使用的版本为4.2.0

安装完毕以后会在项目的引用路径下增加一个FFmpeg.AutoGen的程序集,如下:

 

AutoGen只是封装调用FFmpeg,程序还是需要下在FFmpeg工具放在程序目录里,且版本要对应。

对应版本下载地址:Download FFmpeg

FFmpeg编译,参考此链接:windows下使用msys2编译FFmpeg源码_崔杰城的博客-优快云博客

FFmpeg编译挺耗时的,笔者已编译好,项目工程中已包含,直接下载工程即可

FFmpeg.AutoGen的很多函数都是用到了指针,工程里要勾选允许不安全代码

 

1、注册FFmpeg库

创建FFmpegBinariesHelper,将FFmpeg的库引用到程序里

    public static class FFmpegBinariesHelper
    {
        internal static void RegisterFFmpegBinaries()
        {
            var current = Environment.CurrentDirectory;
            var probe = Path.Combine("FFmpeg", "bin", Environment.Is64BitProcess ? "x64" : "x86");
            while (current != null)
            {
                var ffmpegBinaryPath = Path.Combine(current, probe);
                if (Directory.Exists(ffmpegBinaryPath))
                {
                    Console.WriteLine($"FFmpeg binaries found in: {ffmpegBinaryPath}");
                    ffmpeg.RootPath = ffmpegBinaryPath;
                    return;
                }

                current = Directory.GetParent(current)?.FullName;
            }
        }
    }

2、FFmpeg初始化

初始化里主要是进行一些编解码的必要初始化以及设置日志输出回调,正式项目可以将日志输出到日志文件,方便后期出现问题分析维护

public static class FFmpegHelper
    {
        /// <summary>
        /// FFmpeg初始化
        /// </summary>
        public static void Init()
        {
            ffmpeg.av_register_all();
            ffmpeg.avcodec_register_all();
            ffmpeg.avdevice_register_all();
            ffmpeg.avformat_network_init();
        }

        /// <summary>
        /// 设置日志输出
        /// </summary>
        public unsafe static void LogSetting(int loglevel)
        {
            ffmpeg.av_log_set_level(loglevel);

            // do not convert to local function
            av_log_set_callback_callback logCallback = (p0, level, format, vl) =>
            {
                if (level > ffmpeg.av_log_get_level()) return;

                var lineSize = 1024;
                var lineBuffer = stackalloc byte[lineSize];
                var printPrefix = 1;
                ffmpeg.av_log_format_line(p0, level, format, vl, lineBuffer, lineSize, &printPrefix);
                var line = Marshal.PtrToStringAnsi((IntPtr)lineBuffer);
                Console.ForegroundColor = ConsoleColor.Yellow;
                Console.Write(line);
                Console.ResetColor();
            };
            ffmpeg.av_log_set_callback(logCallback);
        }
    }

3、调用

在界面加载完成后调用

    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            FFmpegBinariesHelper.RegisterFFmpegBinaries();
            FFmpegHelper.Init();
            FFmpegHelper.LogSetting(ffmpeg.AV_LOG_TRACE);
        }
    }

至此工程搭建完毕,下一篇将实现:基于FFMpeg.AutoGen的RTSP拉流

本章节工程链接:https://download.youkuaiyun.com/download/pomtom/24317224

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值