天天看点

基于FFMPEG API开发RTMP推流器基于FFMPEG API开发RTMP推流器

基于FFMPEG API开发RTMP推流器

1. 环境

Win10 + Visual Stdio 2017

2. 材料

Windows版本的FFMPEG库

下载地址:https://ffmpeg.zeranoe.com/builds/

如图所示,下载Windows64位的4.0.2版本的Shared和Dev版本,Dev包含的是开发ffmpeg程序所需要的头文件及链接库,在编译时会用到;Shared包含的是运行程序时调用到的ffmpeg的动态库,在运行时用到。这两个都要下载。

基于FFMPEG API开发RTMP推流器基于FFMPEG API开发RTMP推流器

3 开发环境配置

  • 创建解决方案

打开Visual Studio 2017,创建一个live的解决方案,

基于FFMPEG API开发RTMP推流器基于FFMPEG API开发RTMP推流器
  • 创建项目
    基于FFMPEG API开发RTMP推流器基于FFMPEG API开发RTMP推流器

项目结构如下图所示。

基于FFMPEG API开发RTMP推流器基于FFMPEG API开发RTMP推流器
  • 运行

此时点本地Windows调试器按键运行一下,如果弹出的控制台有打印Hello World, 则项目创建成功。

VS默认为Debug环境为x86配置,我们可以将其手动改为x64平台。如下图所示,再次点本地Windows调试器按键运行一下,看是否还会成功打印Hello World,答案当然是肯定的啦。

基于FFMPEG API开发RTMP推流器基于FFMPEG API开发RTMP推流器

接下来我们把ffmpeg加入到我们的解决方案中,在我们的live目录下创建一个ffmpeg的目录来存放库及头文件,还有运行动态库。将ffmpeg-4.0.2-win64-dev文件夹下的include和lib,还有ffmpeg-4.0.2-win64-shared文件夹下的bin目录都复制到ffmpeg目录下。

接下来就是把它们配置到我们的live解决方案中

3.1 配置include和lib目录

右击项目,属性 --> C/C++ --> 常规 添加include目录

基于FFMPEG API开发RTMP推流器基于FFMPEG API开发RTMP推流器

链接器–>常规–>附加库目录 添加lib目录 如下图

基于FFMPEG API开发RTMP推流器基于FFMPEG API开发RTMP推流器

链接器–》输入–》附加依赖项–》编辑,输入lib目录中所有的.lib文件名。

基于FFMPEG API开发RTMP推流器基于FFMPEG API开发RTMP推流器
基于FFMPEG API开发RTMP推流器基于FFMPEG API开发RTMP推流器

运行环境配置:配置属性–>高度–>环境–>输入path=ffmpeg bin目录

基于FFMPEG API开发RTMP推流器基于FFMPEG API开发RTMP推流器

至此,所有的配置完成。

3.2 导入源码

我们这次的推流工程项目StreamPusher是直接拿雷神的simplest_ffmpeg_streamer的工程来升级的,雷神的simplest_ffmpeg_streamer的github地址为https://github.com/leixiaohua1020/simplest_ffmpeg_streamer, 它这个工程是在2014年10月份写的,当时的ffmpeg版本为2.3.6, https://ffmpeg.org/olddownload.html,

基于FFMPEG API开发RTMP推流器基于FFMPEG API开发RTMP推流器

这次我们尝试着给它升级到4.0.2,看它能不能正常运行。

首先将雷神的simplest_ffmpeg_streamer项目中的simplest_ffmpeg_streamer.cpp复制到我们的StreamPusher.cpp里,编译时主要碰到三个问题,

  • 预编译头错误
基于FFMPEG API开发RTMP推流器基于FFMPEG API开发RTMP推流器

解决方法

  1. 在解决方案资源管理器中,右击相应的.cpp文件,点击“属性”
  2. 在左侧配置属性中,点开“C/C++”,单击“预编译头”
  3. 更改右侧第一行的“创建/使用预编译头”,把选项从“使用预编译头(/Yu)”改成“不使用预编译头”
    基于FFMPEG API开发RTMP推流器基于FFMPEG API开发RTMP推流器
  • CODEC_FLAG_GLOBAL_HEADER找不到

在4.0.2版本中,它已被替换成AV_CODEC_FLAG_GLOBAL_HEADER。

  • 变量/类被声明已否决

发现报非常多的变量/类被声明已否决,先暂时关掉SDL试一下,

3.3 验证

编译成功后,再搭建一个SRS流媒体服务器验证一下(网上有许多博客可参考,比较简单),推流成功。

基于FFMPEG API开发RTMP推流器基于FFMPEG API开发RTMP推流器

下一节,我们将打开SDL,通过修改代码,实现将此工程升级到4.0.3版本。

完整代码可到我的github下载:

https://github.com/onroadtech/live

branch: master

继续阅读