1.代码来源
该部分代码源自雷神最简单的基于FFmpeg的推流器,感谢雷神!在此之上适配C#语言。
2.基于FFmpeg的C#推流流程
- 下载FFmpeg的动态链接库(dll)文件,其中包含的ffmpeg.exe、ffplay.exe可以跟你写的代码印证,先用ffmpeg命令行尝试是否可以编解码。ffmpeg下载地址
- 将dll文件放入项目工程中,并点击每个文件->属性->复制到输出目录->如果较新则复制。
- 添加FFmpeg.AutoGen的Nuget包,并添加如下代码将FFmpeg文件地址告知AutoGen:
- 若出现找不到dll的情况,考虑AutoGen与FFmpeg的版本是否兼容。若版本无问题,考虑AutoGen与(.net或framework)的版本问题!
public static class FFmpegHelper
{
public static void RegisterFFmpegBinaries()
{
//获取当前软件启动的位置
var currentFolder = AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
//ffmpeg在项目中放置的位置
var probe = Path.Combine("FFmpeg", "bin", Environment.Is64BitOperatingSystem ? "x64" : "x86");
while (currentFolder != null)
{
var ffmpegBinaryPath = Path.Combine(currentFolder, probe);
if (Directory.Exists(ffmpegBinaryPath))
{
//找到dll放置的目录,并赋值给rootPath;
ffmpeg.RootPath = ffmpegBinaryPath;
return;
}
currentFolder = Directory.GetParent(currentFolder)?.FullName;
}
//旧版本需要要调用这个方法来注册dll文件,新版本已经会自动注册了
//ffmpeg.avdevice_register_all();
}
}
3.推送视频流到RTMP服务器
private AVFormatContext* _formatContext;
private AVStream* _vedioStream;
private int _vedioIndex;
private AVFormatContext* _outputContext = null;
private AVPacket packet;
private int frame_index = 0;
/// <summary>
/// 初始化推流
/// </summary>
/// <param name="filePath"></param>
/// <param name="url"></param>
public void PushVedio(string filePath, string url)
{
FFmpegHelper.RegisterFFmpegBinaries();
// 初始化封装和解封装格式
ffmpeg.av_register_all();
// 初始化网络库
ffmpeg.avformat_network_init(