C#使用FFmpeg的总结

摘要:
上一篇文章提到FFmpeg解决了项目中的视频和语音问题,并表示C#和FFmpeg必须提到两个类库。最后,选择了FFmpeg.AutoGen,它可以通过API更好地控制灵活性,更好地满足您的个人需求。6、 C#FFmpeg使用SDL2实现rtmp播放器7。C#FFmpeg本地mp3,mp4文件播放8。C#FFmpeg在保存到本地文件时播放rtmp视频。

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

1、Xabe.FFmpeg

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

2、FFmpeg.AutoGen

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

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

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

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

FFmpeg.AutoGen源码不是每个版本都保留github上,最好克隆到自己项目中,不同版本的API差别还是有很大,稳定一个版本后即使有小问题,有源代码可以自己修改一下。

项目中手机和电脑视频采用的是rtmp方式推流,现在自己总结一下

开始说只需要视频,当时就网上搜索一下 https://blog.csdn.net/vanjoge/article/details/79657874

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

解决方式记录如下:

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


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

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


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


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

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

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

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

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


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

      该播放器是基于ffmpeg来实现的,播放器3万,推流器也是3万,核算一下觉得不是很划算,因为我现在遇到问题仅仅是声音无法播放,而项目也不是很着急还有一段时间,也想挑战一下自己。


六、主角上场,使用FFmpeg.AutoGen来操作API

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


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


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

拉流方面:

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

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

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

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

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

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

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

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

拉流播放主要有两个难点 

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

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

    由于本地解析很快缓存清理过导致快播放不完整,不清理缓存容易搞爆,比如播放60分钟的mp3文件。


推流方面:

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

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

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

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

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









 

免责声明:文章转载自《C#使用FFmpeg的总结》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇CSS-顶部滚动进度条关于ArcMap中的地图文档单位下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

如何学好VC和MFC(各前辈学习方法及感受整理)(三)

如何学习vc++(vc的用处) 1 vc的用处我感觉下面一些领域比较适合于用vc: 操作系统编程,game,图形设计,corba编程,com编程,网络编程。我谈谈我的体会。我现在在深圳的一家公司从事IP电话网关的开发。通过这个项目,我 才真正体会到VC有多么强大,上百个线程同时工作,数据库并发访问,而且全部软件基 于COM构造,这样高性能的大型软件,只有...

Facebook应用程序权限请求以及数据获取

最近因工作需要研究了一下facebook的API调用. 虽然是一个不存在的网站,但也是工作内容的一部分,需要认真对待.既然对于咱们国人来说不存在,当然也就没有汉字可看了.英文文档让我头晕了好一阵子,吐了好几次之后终于摸清了脉络. 大致步骤是: 1、创建一个应用程序,可以获得App ID/API Key和App Secret。 2、使用URL: https:...

FFMPEG高级编程第一篇:环境搭建及编译

  前段时间在翻看电脑里面资料时,发现了以前做的在嵌入式硬件上面运行以ffmepg为基础,以嵌入式硬件解码的多媒体播放工作,发现都快忘记完了。今日得闲整理温习了一下ffmpeg在嵌入式上的运用,这里给大家分享一下,顺便做了一下记录以备以后使用时参考。 本文(记录)与目前网上很多关于ffmpeg的文章相比有两个特点: 一、重点不在于ffmpeg的解码部分(这...

转:C#操作摄像头

转自: http://blog.csdn.NET/chenhongwu666/article/details/40594365 如有雷同,不胜荣幸,若转载,请注明 最近做项目需要操作摄像头,在网上百度了很多资料,很多都是C#调用window API 发送SendMessage,实现操作摄像头,但是C#调用window API的时候因为驱动的问题,总是弹出视...

2019面试宝典之.Net

  1、简述 private、 protected、 public、 internal 修饰符的访问权限。 private : 私有成员, 在类的内部才可以访问。 protected : 保护成员,该类内部和继承类中可以访问。 public : 公共成员,完全公开,没有访问限制。 internal: 当前程序集内可以访问。 2、ADO.NET中的五个主要...

FFmpeg在Linux下编译使用

1.FFmpeg编译 1.1.安装yasm 这里我是直接通过ubuntu包安装的,当然也可以通过编译源码来安装。 sudo apt-get install yasm 1.2.下载FFmpeg git clone https://git.ffmpeg.org/ffmpeg.git 1.3.配置、编译FFMPEG ./configure --prefix=ho...