C# 使用FFmpeg.Autogen对byte[]进行编解码,参考:https://github.com/vanjoge/CSharpVideoDemo
入口调用类:
using System;
using System.IO;
using System.Drawing;
using System.Runtime.InteropServices;
using FFmpeg.AutoGen;
namespace FFmpegAnalyzer
{
public class FFmpegWrapper
{
/// <summary>
/// 默认的编码格式
/// </summary>
public AVCodecID DefaultCodecFormat { get; set; } = AVCodecID.AV_CODEC_ID_H264;
/// <summary>
/// 注册FFmpeg
/// </summary>
public static void RegisterFFmpeg()
{
FFmpegBinariesHelper.RegisterFFmpegBinaries();
// 初始化注册ffmpeg相关的编码器
ffmpeg.av_register_all();
ffmpeg.avcodec_register_all();
ffmpeg.avformat_network_init();
}
/// <summary>
/// 注册日志
/// <exception cref="NotSupportedException">.NET Framework 不支持日志注册</exception>
/// </summary>
private unsafe void RegisterFFmpegLogger()
{
// 设置记录ffmpeg日志级别
ffmpeg.av_log_set_level(ffmpeg.AV_LOG_VERBOSE);
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.Write(line);
};
ffmpeg.av_log_set_callback(logCallback);
}
#region 编码器
/// <summary>
/// 创建编码器
/// </summary>
/// <param name="frameSize">编码前一帧原始数据的大小</param>
/// <param name="isRgb">rgb数据</param>
public void CreateEncoder(Size frameSize, bool isRgb = true)
{
_fFmpegEncoder = new FFmpegEncoder(frameSize, isRgb);
_fFmpegEncoder.CreateEncoder(DefaultCodecFormat);
}
/// <summary>
/// 编码
/// </summary>
/// <param name="frameBytes">编码帧数据</param>
/// <returns></returns>
public byte[] EncodeFrames(byte[] frameBytes)
{
return _fFmpegEncoder.EncodeFrames(frameBytes);
}
/// <summary>
/// 释放编码器
/// </summary>
public void DisposeEncoder()
{
_fFmpegEncoder.Dispose();
}
#endregion
#region 解码器
/// <summary>
/// 创建解码器
/// </summary>
/// <param name="decodedFrameSize">解码后数据的大小</param>
/// <param name="isRgb">Rgb数据</param>
public void CreateDecoder(Size decodedFrameSize, bool isRgb = true)
{
_fFmpegDecoder = new FFmpegDecoder(decodedFrameSize, isRgb);
_fFmpegDecoder.CreateDecoder(DefaultCodecFormat);
}
/// <summary>
/// 解码
/// </summary>
/// <param name="frameBytes">解码帧数据</param>
/// <returns></returns>
public byte[] DecodeFrames(byte[] frameBytes)
{
return _fFmpegDecoder.DecodeFrames(frameBytes);
}
/// <summary>
/// 释放解码器
/// </summary>
public void DisposeDecoder()
{
_fFmpegDecoder.Dispose();
}
#endregion
/// <summary>编码器</summary>
private FFmpegEncoder _fFmpegEncoder;
/// <summary>解码器</summary>
private FFmpegDecoder _fFmpegDecoder;
}
}
其它业务类:
using System;
using System.IO;
using System.Runtime.InteropServices;
namespace FFmpegAnalyzer
{
internal class FFmpegBinariesHelper
{
private const string LD_LIBRARY_PATH = "LD_LIBRARY_PATH";
internal static void RegisterFFmpegBinaries()
{
switch (Environment.OSVersion.Platform)
{
case PlatformID.Win32NT:
case PlatformID.Win32S:
case PlatformID.Win32Windows:
var current = AppDomain.CurrentDomain.BaseDirectory;
var probe = $"FFmpeg/bin/{(Environment.Is64BitProcess ? @"x64" : @"x86")}";
while (current != null)
{
var ffmpegDirectory = Path.Combine(current, probe);
if (Directory.Exists(ffmpegDirectory))
{
Console.WriteLine($"FFmpeg binaries found in: {ffmpegDirectory}");
RegisterLibrariesSearchPath(ffmpegDirectory);
return;
}
current = Directory.GetParent(current)?.FullName;
}
break;
case PlatformID.Unix:
case PlatformID.MacOSX:
var libraryPath = Environment.GetEnvironmentVariable(LD_LIBRARY_PATH);
RegisterLibrariesSearchPath(libraryPath);
break;
}
}
private static void RegisterLibrariesSearchPath(string path)
{
switch (Environment.OSVersion.Platform)
{
case PlatformID.Win32NT:
case PlatformID.Win32S:
case PlatformID.Win32Windows:
SetDllDirectory(path);
break;
case PlatformID.Unix:
case PlatformID.MacOSX:
string currentValue = Environment.GetEn

博客介绍了C#使用FFmpeg.Autogen对byte[]进行编解码的相关内容,给出了参考链接,提及入口调用类和其它业务类,还指出需将ffmpeg类库复制到生成目录,并给出了使用代码。
最低0.47元/天 解锁文章
5442

被折叠的 条评论
为什么被折叠?



