第23课 使用FFmpeg将rtmp流再转推到rtmp服务器

通过上节课的学习,我们已经可以正常播放本地rtmp流及mp4文件,这节课,我们将在上节课的基础上实现一个常用的转推功能:读取rtmp流或mp4文件并转推到rtmp服务器上实现直播转发功能。

一、FFmpeg API 转码推流的一般过程

1.引入ffmpeg库:在代码中引入ffmpeg库,以便使用其提供的功能。

2.打开输入文件:使用avformat_open_input()函数打开输入文件,并获取输入文件的相关信息。

3.查找流信息:使用avformat_find_stream_info()函数查找输入文件中的流信息,并将其存储在AVFormatContext结构体中。

4.创建输出上下文:使用avformat_alloc_output_context2()函数创建输出上下文,并设置输出格式。

5.添加输出流:根据输入文件的流信息,使用avformat_new_stream()函数创建输出流,并将其添加到输出上下文中。

6.设置编码参数:为输出流设置编码参数,包括编码器、编码器参数等。

7.输出文件:使用avio_open()函数打开输出文件,并将输出文件的相关信息存储在输出上下文中。

8.写入文件头:使用avformat_write_header()函数写入输出文件的文件头。

9.转码推流:循环读取输入文件的数据包,使用av_read_frame()函数读取数据包,然后使用avcodec_send_frame()函数发送数据包给编码器进行编码,再使用avcodec_receive_packet()函数接收编码后的数据包,最后使用av_interleaved_write_frame()函数将编码后的数据包写入输出流。

10.写入文件尾:使用av_write_trailer()函数写入输出文件的文件尾。

11.释放资源:释放所有的上下文、流和其他资源,使用avformat_close_input()函数关闭输入文件。

二、转推功能的具体实现

与上节课的播放功能相比,转推功能只是在原来的基础上又增加了编码功能和向rtmp服务器的推送功能。

1.为了与上节课的播放功能区分,新建或直接复制fmlp(Flash Media Live Player)类为一个新的fmlt(Flash Media Live Transcoder)类,并修改主对话框相应代码使fmlt能正常工作并实现正常的播放功能。

修改如下:

//#include "fmlp.h"
#include "fmlt.h"//fmlp *myFmlp = new fmlp();
fmlt *myFmlt = new fmlt();

2.与mp4文件相比,rtmp流转推实现起来相对容易,因此,我们先在原来的基础上实现rtmp流的转推功能。

以下是一个示例代码,演示了使用ffmpeg API进行转码推流的过程:

#include <stdio.h>
#include <libavformat/avformat.h>int main() {// 1. 引入ffmpeg库av_register_all();// 2. 打开输入文件AVFormatContext *inputContext = NULL;if (avformat_open_input(&inputContext, "input.mp4", NULL, NULL) != 0) {printf("Failed to open input file\n");return -1;}// 3. 查找流信息if (avformat_find_stream_info(inputContext, NULL) < 0) {printf("Failed to find stream information\n");return -1;}// 4. 创建输出上下文AVFormatContext *outputContext = NULL;if (avformat_alloc_output_context2(&outputContext, NULL, "flv", "output.flv") < 0) {printf("Failed to create output context\n");return -1;}// 5. 添加输出流for (int i = 0; i < inputContext->nb_streams; i++) {AVStream *inputStream = inputContext->streams[i];AVStream *outputStream = avformat_new_stream(outputContext, inputStream->codec->codec);if (!outputStream) {printf("Failed to create output stream\n");return -1;}if (avcodec_copy_context(outputStream->codec, inputStream->codec) < 0) {printf("Failed to copy codec context\n");return -1;}}// 6. 设置编码参数// ...// 7. 打开输出文件if (avio_open(&outputContext->pb, "output.flv", AVIO_FLAG_WRITE) < 0) {printf("Failed to open output file\n");return -1;}// 8. 写入文件头if (avformat_write_header(outputContext, NULL) < 0) {printf("Failed to write output file header\n");return -1;}// 9. 转码推流AVPacket packet;while (av_read_frame(inputContext, &packet) >= 0) {AVStream *inputStream = inputContext->streams[packet.stream_index];AVStream *outputStream = outputContext->streams[packet.stream_index];// 发送数据包给编码器进行编码if (avcodec_send_packet(outputStream->codec, &packet) < 0) {printf("Failed to send packet to encoder\n");return -1;}// 接收编码后的数据包while (avcodec_receive_packet(outputStream->codec, &packet) >= 0) {packet.stream_index = outputStream->index;av_write_frame(outputContext, &packet);av_packet_unref(&packet);}}// 10. 写入文件尾av_write_trailer(outputContext);// 11. 释放资源avformat_close_input(&inputContext);avformat_free_context(outputContext);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/660703.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

内存泄漏调试 ---- jemalloc的heap profiling

使用jemalloc时&#xff0c;可以通过profiling机制来发现并定位内存泄漏(memory leak)。本文翻译自原文并增加了一些例子。 1、安装 这里我们编译安装jemalloc.5.10&#xff0c;注意在configure的时候添加了–enable-prof选项&#xff0c;这样才能打开profiling机制。下文中通…

Django的request.session缓存的广发用法

前言&#xff1a; 相信同学们在学习PythonWeb开发的时候和我一样会遇到许多问题&#xff0c;今天我这边举几个例子涉及到session缓存的问题&#xff0c;由于当时并没有接触session缓存的技术内容&#xff0c;所以往往头大&#xff0c;一时间不知带如何解决&#xff0c;老师也会…

2401cmake,学习cmake2

步4:安装与测试 现在开始给项目添加安装规则和支持测试. 安装规则 安装规则非常简单:对MathFunctions,想安装库和头文件,对应用,想安装可执行文件和配置头. 所以在MathFunctions/CMakeLists.txt尾添加: install(TARGETS MathFunctions DESTINATION lib) install(FILES Mat…

服务网格(Service Mesh)流行工具

在这篇博客中&#xff0c;我们将介绍微服务的最佳服务网格工具列表&#xff0c;这些工具提供安全性、金丝雀部署、遥测、负载均衡等。 用于部署和操作微服务的服务网格工具的数量不断增加。在这篇文章中&#xff0c;我们将探讨您应该用来构建自己的服务网格架构的顶级服务网格…

【Eclipse平台】2 Eclipse Workbench工作台介绍

Eclipse Workbench工作台介绍 本文介绍Eclipse工作台Workbench。 当工作台启动时&#xff0c;首先看到的是一个对话框&#xff0c;该对话框允许我们选择工作区的位置。工作区是存储工作的目录。现在&#xff0c;只需单击“确定”即可选择默认位置。 选择工作区位置后&#x…

如何访问 Oracle OKE 集群

OKE是Oracle Cloud提供的托管Kubernetes服务&#xff0c;为用户提供强大而灵活的容器编排平台。在本文中&#xff0c;我们将详细介绍如何有效地与OKE集群进行交互&#xff0c;包括访问集群的不同方式、管理访问权限以及执行常见操作的步骤。 1 安装oci命令 1.1 在Oracle Linux…

【gRPC】protoc文件转py文件

以下基于Win系统下Python的venv虚拟环境演示 《Python3笔记之venv虚拟环境》《Python笔记之pip国内镜像修改方法》 在桌面创建个test目录作为项目目录&#xff0c;初始化venv环境后&#xff0c;安装基础依赖&#xff1a; pip install grpcio grpcio-reflection grpcio-tools p…

证券开户怎么联系专属客户经理?新手必看!

证券开户联系专属客户经理的方式有很多&#xff0c;可以通过手机网上找客户经理&#xff0c;现在这种方式是最多的&#xff0c;比如咱们网站都是各大券商专业的客户经理&#xff0c;在线联系就可以帮您安排。您自己也可以挑选自己觉得好的券商和客户经理&#xff0c;然后再沟通…

Backtrader 文档学习- Broker - Trade

Backtrader 文档学习- Broker - Trade 1. 概述 交易的定义&#xff1a; 通过操作持仓从0变为大小为X时&#xff08;可能为正/负&#xff0c;对于多头/空头头寸&#xff09;&#xff0c;则交易处于开放状态。当持仓从X变为0时&#xff0c;交易关闭。 以下两个操作&#xff1a…

使用Server-Sent Events实现后端主动向前端进行通信

目录 概述 使用 Server-Sent Events (SSE) 示例 1.创建SpringBoot项目添加web依赖&#xff0c;并编写以下代码 2.创建Vue项目并在项目的.vue文件中编写以下代码 效果说明 使用触发的方式向前端传递数据 总结 概述 在典型的前后端分离架构中&#xff0c;前端通过发起 H…

静态HTML引入vue封装组件

在对历史原生html代码使用vue重构项目时&#xff0c;可以利用vue相关组件进行项目优化、实现统一管理&#xff0c;本文结束htmlvue的构建方式&#xff0c;欢迎大家阅读交流。 1、 下载vue.js 可自行到官网下载所需版本或者使用cdn资源 2、封装通用组件 2.1 封装通用实例化m…

MIMIC-IV官方视图解析 - cardiac_marker心脏标记表

今天在学习官方衍生表mimiciv_derived.cardiac_marker心脏标记表时候发现了一些问题&#xff1a; 该表中troponin_t &#xff08;肌钙蛋白t&#xff09;的值结果都是空值null 或者 ___ &#xff08;由于去标识化&#xff09;&#xff0c; 这明显是不合理的 小编查看了该表的官…

MySQL-运维篇-日志

一、错误日志 二、二进制日志 1、介绍 2、日志格式 3、日志查看 4、日志删除 三、查询日志 四、慢查询日志

汽车软件开发模式的5个特点

汽车软件开发属于较为复杂的系统工程&#xff0c;经常让来自不同知识背景的工程师在观点交锋时出现分歧。在解决复杂性和对齐讨论基准时&#xff0c;可以通过勾勒出讨论对象最关键的几个特征来树立典型概念。本文旨在通过5个典型特点的抽取&#xff0c;来勾勒出汽车软件开发模式…

python实现贪吃蛇小游戏(附源码)

文章目录 导入所需的模块坐标主游戏循环模块得分 贪吃蛇小游戏&#xff0c;那个曾经陪伴着00后和90后度过无数欢笑时光的熟悉身影&#xff0c;仿佛是一把打开时光之门的钥匙。它不仅是游戏世界的经典之一&#xff0c;更是我们童年岁月中不可或缺的一部分&#xff0c;一个承载回…

Spring如何进行参数校验

在Java开发中&#xff0c;对输入参数进行校验是一个非常重要的环节&#xff0c;它可以帮助我们避免非法数据对程序造成的影响。Spring框架提供了多种方式进行参数校验&#xff0c;本文将详细介绍如何在Spring中进行参数校验。 一、使用Spring的Validated和Valid注解 Spring提供…

新媒体与传媒行业数据分析实践:从网络爬虫到文本挖掘的综合应用,以“中国文化“为主题

大家好&#xff0c;我是八块腹肌的小胖&#xff0c; 下面将围绕微博“中国文化”以数据分析、数据处理、建模及可视化等操作 目录 1、数据获取 2、数据处理 3、词频统计及词云展示 4、文本聚类分析 5、文本情感倾向性分析 6、情感倾向演化分析 7、总结 1、数据获取 本…

征集各位的意见

1.B站 下一个月我打算在B站开始上传视频教程了&#xff0c;关注我的有一部分是看我TMS320F28377D的&#xff0c;有一部分是看我LPC804M101的&#xff0c;我这里问一下大家想先看哪个教程&#xff1f;好多盆友看我文章里都描述的不是很清楚&#xff0c;可能我上传B站&#xff0…

SwiftUI 动画入门之一:路径动画(Path Animations)

概览 在 SwiftUI 的开发中,我们往往需要使用千姿百态的动画把我们的界面元素妆点的更加鲜活灵动。 如上图所示,我们使用路径动画使折线图更加生动了!这是怎么做到的呢? 在本篇博文中,您将学到以下内容: 概览1. 路径与形状(Path and Shape)2. 路径动画的原理3. 让路径…

Zookeeper服务注册与发现实战

目录 设计思路 Zookeeper注册中心的优缺点 SpringCloudZookeeper实现微服务注册中心 第一步&#xff1a;在父pom文件中指定Spring Cloud版本 第二步&#xff1a;微服务pom文件中引入Spring Cloud Zookeeper注册中心依赖 第三步&#xff1a; 微服务配置文件application.y…