C#使用FFmpeg的总结

上篇文章提到FFmpeg解决项目中视频和语音问题,说道C#和FFmpeg不得不提的2个类库。html

一、Xabe.FFmpeghtml5

简单查看了下源码和demo,发现基于ffmpeg.exe的命令行参数进行处理。git

二、FFmpeg.AutoGen github

把C语言对外API和类型翻译成C#的API和对象。缓存

看了一下这个源码生成,其中使用了CppSharp来生成g.cs的文件,而后在编译g.cs文件。网络

这2类库进行对比,第一个相对简单,第二个处理相对复杂,固然功能也强大。app

最终选择FFmpeg.AutoGen ,经过API方式控制灵活度更好,更能知足本身的个性需求(推流要实现暂停和继续推流功能)。测试

FFmpeg.AutoGen源码不是每一个版本都保留github上,最好克隆到本身项目中,不一样版本的API差异仍是有很大,稳定一个版本后即便有小问题,有源代码能够本身修改一下。操作系统

项目中手机和电脑视频采用的是rtmp方式推流,如今本身总结一下.net

开始说只须要视频,当时就网上搜索一下 http://www.javashuo.com/article/p-krlfsaji-cm.html

在这个基础稍微整理改进一下,交给客户。然而没有过多久提出新需,须要显示声音,为了解决这个问题花费很多时间

解决方式记录以下:

1、使用ffplay.exe播放声音,一直报错没有效果。


2、使用Vlc.DotNet能正常播放视频和语音,可是声音延迟7秒,随着时间加长 有时候都延迟50多秒,

     另外在观看视频时候 随时须要保存到本地,还须要单独请求地址,明显不符合要求。


3、在播放视频基础上,使用sdl2.Net播放声音,死活没有效果 。


4、参考网络C++代码,写C++动态库让C#来调用

    C#调用C++代码,先简单总结下后面准备写个博客,有两种常见方式调用 :

    一、调用纯粹的C++库里面对外API ,即C#使用[DllImport("Test.dll")]方式。

    二、调用托管C++的库,即C#直接引用。C++里面添加一个类调用原始C++的方法,即建立一个类来简单包装一下。

  开始用第一种方式调用,就会出现屡次调用视频报错问题,改成第二种方式new对象解决了第一种的问题,但又发现好多其余问题, 好比不一样操做系统 须要生成不一样的dll, 不该该选择debug版本不然在不一样电脑表现不同,最关键的是有些没有及时释放,视频10分钟后就崩了,总之对C++了解很少会遇到各类问题,被坑怕了。


5、网上找了一个C++封装的播放器和者推流器而后提供给C#使用。

      该播放器是基于ffmpeg来实现的,播放器3万,推流器也是3万,核算一下以为不是很划算,由于我如今遇到问题仅仅是声音没法播放,而项目也不是很着急还有一段时间,也想挑战一下本身。


6、主角上场,使用FFmpeg.AutoGen来操做API

   实在没有更好的方法,决定用C#来进行,由于ffmpeg用C#的资料真的太少了,开始以前知道确定比较费劲,想作的完美些就硬着头皮来干。通过一些时间努力实现了这些功能,很自豪的是这个视频播放器延迟特别低,感受是0延迟若是说有延迟基本也在1秒内左右,比市场上不少播放都快,好比这个著名播放器 PotPlayer。


    采用第六种方式后交给客户,客户很满意,而后客户给他们的客户部署在生产环境中运行,客户的客户遇到一个问题 苹果手机发送的语音,在电脑上播放是娃娃音。测试开发的时候是用安卓手机,由于手机端使用html5开发,发布成app一样的代码就没有仔细测试苹果手机。在安卓手机没有任何问题完美实现功能, 到了苹果手机上就不行,心中一千个擦尼玛,苹果这样坑开发者喜欢搞特殊 。后来发现采样率不同特别是苹果比较低的采样率(32000)有这个问题,44100和48000常见的没有问题,通过一段时间研究才给解决掉。


后续准备写一些列文章来总结一下基于FFmpeg.AutoGen实现推流和拉流的功能,已经实现的功能主要包括下面

拉流方面:

1、C# FFmpeg播放rtmp视频(Bitmap或者BitmapSource来展现图像)

2、C# FFmpeg使用SDL2方式播放rtmp视频

3、C#FFmpeg使用NAudio方式播放rtmp音频。

4、C#FFmpeg使用SDL2方式播放rtmp音频。

5、C#FFmpeg实现rtmp播放器 NAudio播放声音和(Bitmap或者BitmapSource来展现图像)。

6、C# FFmpeg使用SDL2实现rtmp播放器

7、C#FFmpeg本地mp3,mp4文件播放(两种方式SDL2和NAudio)

8、C#FFmpeg边播放rtmp视频,边保存到本地文件。

拉流播放主要有两个难点 

一、播放器播放网络rtmp地址 声音和视频不一样步

二、C#FFmpeg播放本地文件,使用NAudio播放声音缓存问题,

    因为本地解析很快缓存清理过致使快播放不完整,不清理缓存容易搞爆,好比播放60分钟的mp3文件。


推流方面:

1、C#FFmpeg使用API推摄像头和麦克风到rtmp远程地址

2、C#FFmpeg使用API推桌面和麦克风到rtmp远程地址

3、C#FFmpeg使用API推本地文件MP4,mkv到rtmp远程地址.

4、C#FFmpeg使用API边推流预览边保存本地文件

5、C#FFmpeg推流实现暂停功能

相关文章
相关标签/搜索