FFmpeg开发笔记(八十一)FFmpeg代码对RTSP和RTMP的推流区别
《FFmpeg开发实战:从零基础到短视频上线》一书的“10.2.2 FFmpeg向网络推流”介绍了如何使用FFmpeg代码向网络推送视频流,当时的例程采用了RTSP方式推流,在向RTSP地址时推流是正常的,但向RTMP地址推流时出现了问题,下面就介绍了如何使用FFmpeg代码向RTMP地址推送视频流。
一、FFmpeg推流环境的区别
首先注意RTSP推流地址以“rtsp://”开头,且RTSP地址的默认端口号为8554。而RTMP推流地址以“rtmp://”开头,且RTMP地址的默认端口号为1935。
其次注意FFmpeg从6.1开始对RTMP协议做了增强支持,主要是支持HEVC、VP9和AV1等编码格式通过RTMP协议进行推流,所以建议将编译环境的FFmpeg版本升级到6.1或者更高版本。
二、FFmpeg推流代码的适配
FFmpeg推流代码对于RTSP地址和RTMP地址主要有下列两点适配区别:
1、调用avformat_alloc_output_context2函数分配音视频文件封装实例的时候,第三个输入参数对于RTSP地址而言要填rtsp,对于RTMP地址而言要填flv。比如以下代码通过判断推流地址的协议类型来决定avformat_alloc_output_context2的第三个参数要填何值。
int ret = 0;
// 分配音视频文件的封装实例(注意rtmp协议的第三个参数填flv,rtsp协议的第三个参数填rtsp)
if (strstr(dest_name, "rtmp") != NULL) {
ret = avformat_alloc_output_context2(&out_fmt_ctx, NULL, "flv", dest_name);
} else {
ret = avformat_alloc_output_context2(&out_fmt_ctx, NULL, "rtsp", dest_name);
}
if (ret < 0) {
av_log(NULL, AV_LOG_ERROR, "Can't alloc output_file %s.\n", dest_name);
return -1;
}
av_log(NULL, AV_LOG_INFO, "Success open push url %s.\n", dest_name);
2、调用avformat_alloc_output_context2函数之后,还要依据推流地址的协议类型来决定是否接着调用avio_open函数打开输出流,对于RTSP地址而言不必调用avio_open,对于RTMP地址而言必须调用avio_open。具体的判断与调用代码如下所示:
// 打开输出流(注意rtsp推流不要调用avio_open,但rtmp推流要调用avio_open)
if (strstr(dest_name, "rtmp") != NULL) {
ret = avio_open(&out_fmt_ctx->pb, dest_name, AVIO_FLAG_READ_WRITE);
if (ret < 0) {
av_log(NULL, AV_LOG_ERROR, "Can't open output_file %s.\n", dest_name);
return -1;
}
}
按照以上两点代码修改了《FFmpeg开发实战:从零基础到短视频上线》随书源码第十章的推流程序代码chapter10/pushvideo.c后,先按照之前的文章《详解MediaMTX的推拉流》启动电脑本地的流媒体服务器MediaMTX,再执行下面的编译命令。
gcc pushvideo.c -o pushvideo -I/usr/local/ffmpeg/include -L/usr/local/ffmpeg/lib -lavformat -lavdevice -lavfilter -lavcodec -lavutil -lswscale -lswresample -lpostproc -lm
编译完成后执行以下命令启动测试程序,期望把2018.mp4推给RTMP协议的推流地址rtmp://127.0.0.1:1935/stream。
./pushvideo ../file/2018.mp4 rtmp://127.0.0.1:1935/stream
接着打开另一个MSYS窗口,同样进入该书第十章的源码目录chapter10,执行下面的编译命令。
gcc pullvideo.c -o pullvideo -I/usr/local/ffmpeg/include -L/usr/local/ffmpeg/lib -I/usr/local/sdl2/include -L/usr/local/sdl2/lib -lsdl2 -lavformat -lavdevice -lavfilter -lavcodec -lavutil -lswscale -lswresample -lpostproc -lm
编译完成后执行以下命令启动测试程序,期望从http://127.0.0.1:8888/stream/index.m3u8拉取视频流并弹窗播放。
./pullvideo http://127.0.0.1:8888/stream/index.m3u8
然后果真弹出一个SDL窗口,正在播放从HLS服务拉取的视频画面,说明修改后的推流代码成功支持了RTMP协议。
更多详细的FFmpeg开发知识参见《FFmpeg开发实战:从零基础到短视频上线》一书。
FFmpeg开发笔记(八十一)FFmpeg代码对RTSP和RTMP的推流区别的更多相关文章
- FFmpeg开发笔记(五):ffmpeg解码的基本流程详解(ffmpeg3新解码api)
若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...
- FFmpeg开发笔记(四):ffmpeg解码的基本流程详解
若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...
- FFmpeg开发笔记(九):ffmpeg解码rtsp流并使用SDL同步播放
前言 ffmpeg播放rtsp网络流和摄像头流. Demo 使用ffmpeg播放局域网rtsp1080p海康摄像头:延迟0.2s,存在马赛克 使用ffmpeg播放网络rtsp文件流 ...
- FFmpeg开发笔记(三):ffmpeg介绍、windows编译以及开发环境搭建
前言 本篇章是对之前windows环境的补充,之前windows的是无需进行编译的,此篇使用源码进行编译,版本就使用3.4.8. FFmpeg简介 FFmpeg是领先的多媒体框架,能够解码 ...
- FFmpeg开发笔记(十):ffmpeg在ubuntu上的交叉编译移植到海思HI35xx平台
FFmpeg和SDL开发专栏(点击传送门) 上一篇:<FFmpeg开发笔记(九):ffmpeg解码rtsp流并使用SDL同步播放>下一篇:敬请期待 前言 将ffmpeg移植到海思H ...
- Modbus库开发笔记之十一:关于Modbus协议栈开发的说明(转)
源: Modbus库开发笔记之十一:关于Modbus协议栈开发的说明
- FFmpeg开发笔记(一)搭建Linux系统的开发环境
对于初学者来说,如何搭建FFmpeg的开发环境是个不小的拦路虎,因为FFmpeg用到了许多第三方开发包,所以要先编译这些第三方源码,之后才能给FFmpeg集成编译好的第三方库.不过考虑到刚开始仅仅调用 ...
- FFmpeg开发笔记(二)搭建Windows系统的开发环境
由于Linux系统比较专业,个人电脑很少安装Linux,反而大都安装Windows系统,因此提高了FFmpeg的学习门槛,毕竟在Windows系统搭建FFmpeg的开发环境还是比较麻烦的.不过若有已经 ...
- Modbus库开发笔记之十一:关于Modbus协议栈开发的说明
对于Modbus协议栈的整个开发内容,前面已经说得很清楚了,接下来我们说明一下与开发没有直接关系的内容. 首先,关于我为什么开发这个协议栈的问题.我们的初衷只是想能够在开发产品时不用每次都重写这一部分 ...
- FFmpeg开发教程一、FFmpeg 版 Hello world
本系列根据项目ffmpeg-libav-tutorial翻译而来 Chapter 0 - 万物之源 -- hello world 然而,本节的程序并不会在终端打印"Hello world&q ...
随机推荐
- jekins 使用
简介 jekins 是一套自动编译打包的工具在各大公司广泛应用 参考链接 https://blog.csdn.net/qq_32352777/article/details/109267847
- 使用math库给我们定一个一些常用常量
简介 使用math库给我们定一个一些常用常量 参考链接 https://www.quantstart.com/articles/Mathematical-Constants-in-C/ code #d ...
- 【原创工具】漫画阅读器 By怜渠客
[原创工具]漫画阅读器 By怜渠客 看本地漫画,一直没找到一款轻量.小巧还便捷的软件,于是自己写了一款. 适用的漫画 1部漫画1个文件夹,其中每1话1个子文件夹,内容为jpg或png或bmp格式的图片 ...
- Unity UGUI源码 URP源码 地址
UGUI源码 地址:https://github.com/Unity-Technologies/uGUI 文档:https://docs.unity3d.com/Packages/com.unity. ...
- unity 编辑器内对Game视图进行截图
直接上代码,注意 脚本需要放在Editor文件夹下 可按组合键,进行截图 ctrl + shift + y using System.IO; using System.Threading.Tasks ...
- 转-OAuth2.0 原理流程及其单点登录和权限控制
原文链接 单点登录是多域名企业站点流行的登录方式.本文以现实生活场景辅助理解,力争彻底理清 OAuth2.0 实现单点登录的原理流程.同时总结了权限控制的实现方案,及其在微服务架构中的应用. 1 什么 ...
- git拉取远程指定分支到本地
git拉取远程指定分支到本地 以前写自己模块的时候,曾经建了一个本地分支dev,然后这个分支很久没有使用了,最近又要使用这个分支dev,然后要将远程仓库master分支上的内容同步到我本地dev分支 ...
- Alexa实时对话翻译技术解析
技术架构概述 某中心推出的Alexa实时翻译功能支持两种不同语言的用户进行对话,由系统自动识别语言并实时翻译.该功能基于现有技术栈构建,包括: 自动语音识别(ASR)系统 某机构Translate神经 ...
- Java程序员应知应会,为什么现在我们不用Servlet了?
https://www.163.com/dy/article/H84P8CPU055368QG.html 每个学习Java的同学都会从Servlet开始学习.Servlet API发表于1998年,可 ...
- [题解]AtCoder Beginner Contest 385(ABC385) A~F
A - Equally 显然分组情况一定是\(1+1+1\)或\(1+2\),直接判定即可. 点击查看代码 #include<bits/stdc++.h> using namespace ...