iMX6ULL 嵌入式linux开发 | 4G无线广播终端实现方案介绍

现有的有线广播,如村上的大喇叭,需要布线,施工麻烦。借助现有的4G网络,传输音频流完全没问题,4G网络结合流媒体技术和MQTT消息传递实现设备间的同步推拉流。这种方案可以避免有线布线的麻烦,同时实现4G无线广播。

方案简介

使用ffmpeg来进行音视频的编码和推流,同时使用流媒体服务器如live555或ZlmediaKit来实现流的传输和分发。结合MQTT消息传递,可以实现设备间的同步推流和拉流。

在使用ffmpeg开始录音并推流的情况下,如果另一个终端设备从流媒体服务器上拉流并播放,可以实现同步播放。ffmpeg是一个功能强大的多媒体处理工具,可以进行音频和视频的编解码、转换和处理等操作。当使用ffmpeg进行录音并推流时,它会将音频数据实时传输到流媒体服务器上。另一个终端设备通过从流媒体服务器上拉取音频流来播放。

方案框图

实现过程

在嵌入式Linux上实现该方案,可以按照以下步骤进行:

  1. 交叉编译ffmpeg:需要在嵌入式Linux系统上安装ffmpeg,用于音视频的编解码和推拉流功能。可以通过源码编译或者适配已有的ffmpeg包。移植参考教程:嵌入式linux下的FFmpeg交叉编译(最全面)-CSDN博客

  2. 选择流媒体服务器:选择适合嵌入式Linux系统的流媒体服务器,如live555或ZlmediaKit,并进行集成和配置。确保其能够在资源受限的环境下运行稳定,安装教程:ZLMediaKit 的安装及使用介绍-CSDN博客。

  3. MQTTBroker部署:需要部署一款mqtt的代理服务器,如emqx.测试期间用mosquitto也可以。

  4. MQTT库集成:选择适合嵌入式Linux系统的MQTT客户端库,如paho-mqtt,进行集成,以实现设备间的信息同步,同步推拉流。

  5. 开发应用程序:编写基于ffmpeg、流媒体服务器和MQTT库的应用程序,实现音视频的编解码、推拉流和MQTT消息通信。在嵌入式系统中以进程或者服务的形式运行该应用程序。

  6. 优化和测试:经过集成和开发后,对系统进行优化和充分测试,确保在嵌入式系统中能够稳定运行并满足实际需求。

测试脚本

简单起见,可以使用python脚本,编写一些测试用例来测试整体效果。使用两块儿开发板,各自装上4G无线网卡,一台设备作为播放设备,一台设备作为录音设备。

# 使用ffmpeg进行推流
ffmpeg -i input.mp4 -vcodec libx264 -acodec aac -f mpegts udp://<4G网络地址>:<端口># 使用ffmpeg进行拉流
ffmpeg -i udp://<4G网络地址>:<端口> -f mpegts output.mp4#使用ffpmeg下载m3u8的网络视频并转码为mp4ffmpeg -i "https://test.xyz/aaa/index.m3u8?auth=0Gds&exp=1697072400&v=6"  -bsf:a aac_adtstoasc -c copy out.mp4 -http_persistent 0#也可以安装VLC播放器进行拉流播放测试

可以使用Python来调用ffmpeg命令。有几种不同的方法可以在Python中调用ffmpeg,其中一种方法是使用subprocess模块。以下是一个简单的示例,展示了如何在Python中使用subprocess来调用ffmpeg:

import subprocess# 示例:使用ffmpeg将input.mp4转换为output.mp4
input_file = "input.mp4"
output_file = "output.mp4"command = ["ffmpeg", "-i", input_file, "-c:v", "libx264", "-c:a", "aac", output_file]subprocess.run(command)

 还可以使用Python的第三方库 ffmpeg-python 来更方便地调用ffmpeg。以下是一个在Python中调用ffmpeg的高级封装,使得调用ffmpeg更加直观和简单。

使用 ffmpeg-python 库的示例:

#测试代码
import ffmpeginput_file = "input.mp4"
output_file = "output.mp4"stream = ffmpeg.input(input_file)
stream = ffmpeg.output(stream, output_file, vcodec="libx264", acodec="aac")
ffmpeg.run(stream)

Python的paho-mqtt库的简单示例:

import paho.mqtt.client as mqtt# 定义回调函数,用于处理连接建立后的行为
def on_connect(client, userdata, flags, rc):print("Connected with result code "+str(rc))# 订阅主题client.subscribe("test/topic")# 定义回调函数,用于处理接收到新消息时的行为
def on_message(client, userdata, msg):print(msg.topic+" "+str(msg.payload))# 创建一个MQTT客户端实例
client = mqtt.Client()# 设置回调函数
client.on_connect = on_connect
client.on_message = on_message# 连接MQTT服务器
client.connect("broker.example.com", 1883, 60)# 在连接被建立后,client.loop_forever()用于保持连接,并处理接收到的消息
client.loop_forever()

 考虑的问题及优化

  1. 网络带宽和稳定性:4G网络的带宽和稳定性对于实时音视频传输至关重要,特别是在移动网络环境下,实现广播终端设备的监控很有必要。

  2. 嵌入式设备性能:嵌入式设备的处理能力和内存等资源是否足够支持音视频编解码、流媒体传输和MQTT通信,选择的嵌入式设备至少支持嵌入式linux系统,方便网络传输和音频编解码,如果想要降低成本,在单片机上实现的话,没有强大的ffmepg库,在推拉流和音视频解码上有门槛。

  3. 流媒体服务器选择:选择适合嵌入式系统的流媒体服务器,确保其能够在有限的资源下稳定运行并提供所需的流媒体功能,常见的如live555或ZlmediaKit流媒体服务器需要部署。

  4. 音视频编解码:嵌入式设备是否具备足够的计算能力进行音视频的编解码工作,并且选择合适的编解码器以兼顾音质和性能。

  5. 安全性:在使用4G网络进行传输时,需要考虑音视频流的加密传输和设备的安全防护措施。

其他资源

ZLMediaKit 的安装及使用介绍-CSDN博客

嵌入式linux下的FFmpeg交叉编译(最全面)-CSDN博客

使用ffmpeg和python脚本下载网络视频m3u8(全网最全面)_ffmpeg 下载m3u8-CSDN博客

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

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

相关文章

[力扣题解] 344. 反转字符串

题目&#xff1a;344. 反转字符串 思路 双指针法 代码 class Solution { public:void reverseString(vector<char>& s) {int i, j, temp;for(i 0, j s.size()-1; i < j; i, j--){temp s[j];s[j] s[i];s[i] temp;}} };

简述 v-if 和 v-show 的区别

v-if 和 v-show 都是 Vue.js 中用于控制元素显示与隐藏的指令&#xff0c;但它们的工作方式有显著的差异。以下是它们之间的主要区别&#xff1a; 渲染方式&#xff1a; v-if&#xff1a;v-if 是“真正”的条件渲染&#xff0c;因为它会确保在切换过程中条件块内的事件监听器和…

Mysql插入中文内容报错解决及其Mysql常用的存储引擎说明

一、问题描述 我们在Mysql数据库的表中插入带有中文内容时报错,提示【1366 - Incorrect string value: \xE5\x8C\x97\xE4\xBA\xAC... for column UserDealer at row 1】,如下图所示: 二、问题分析 一般来说插入中文内容有问题我们首先想到的就是编码问题;我们可以查看该表使…

【Python】 如何在Python中导入其他Python文件?

基本原理 在Python编程中&#xff0c;我们经常需要将代码组织成模块&#xff0c;以便于重用和维护。模块是包含Python定义和语句的文件。导入模块可以让你访问其他文件中定义的函数、类和变量等。Python提供了几种不同的方法来导入模块。 代码示例 示例1&#xff1a;导入整个…

超值分享50个DFM模型格式的素人直播资源,适用于DeepFaceLive的DFM合集

50直播模型&#xff1a;点击下载 作为直播达人&#xff0c;我在网上购买了大量直播用的模型资源&#xff0c;包含男模女模、明星脸、大众脸、网红脸及各种稀缺的路人素人模型。现在&#xff0c;我将这些宝贵的资源整理成合集分享给大家&#xff0c;需要的朋友们可以直接点击下…

在线生成数据库er图的工具

网址 https://databasediagram.com/ 其实很早之前我也有类似的想法&#xff0c;根据数据表结构&#xff0c;显示数据表之间的关系图。 当时我还写了一个工具&#xff0c;可惜后来就没怎么用过了。 这个网站和我当时的思路很像&#xff0c;只不过他这个页面显示比我的好得多&…

【c++提高】奶牛和草丛

目录 说明 输入格式 输出格式 样例 输入数据 输出数据 数据范围 题解 说明 奶牛Bessie计划好好享受柔软的春季新草。新草分布在R行C列的牧场里。它想计算一下牧场中的草丛数量。 在牧场地图中&#xff0c;每个草丛要么是单个“#”&#xff0c;要么是有公共边的相邻多个…

苍穹外卖--sky-take-out(一)

目录 d1 软件开发流程 项目介绍 产品原型 技术选型 前端环境搭建 后端环境搭建 Git版本控制 数据库环境搭建 nginx反向代理和负载均衡 导入接口文档 Swagger 问题 d2 用户登录 代码实现 MD5密码加密 新增员工 需求分析与设计 代码开发 代码完善&#xff08;Threa…

python中泛型的使用及简单样例

目录 一、泛型的定义 二、泛型的使用样例 2.1 泛型类 2.2. 泛型函数 2.3 泛型集合类型 一、泛型的定义 泛型允许你定义数据结构或函数时使用类型参数&#xff0c;这些类型参数在具体使用时可以被替换为具体的类型。Python 的 typing 模块提供了对泛型的支持&#xff0c;使…

ACW石子合并-XMUOJ元素共鸣:唤醒神之眼 -区间DP

题目 思路 话不多说&#xff0c;直接上代码 代码 /* ACW石子合并-XMUOJ元素共鸣&#xff1a;唤醒神之眼 JinlongW-2024/05/25 区间DP 当i<j时&#xff0c;f[i][j]min(f[i][k]f[k][j]s[j]-s[i-1]) 当ij时&#xff0c;f[i][j]0 最终答案&#xff1a;f[1][n] *//* 区间DP…

maven-依赖管理

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、Maven BOM二、使用三、SpringBoot的依赖管理 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 依赖管理能带来啥&#xff1a; 避免…

二进制的协议的测试程序

一、引子 由于要调试二进制私有协议&#xff0c;不想用C重头到尾写&#xff0c;用C写工程量有点大&#xff0c;因此想找一个比较简单的工具&#xff0c;postman无法实现&#xff0c;外界的几乎找不到合适的工具&#xff0c;只能考虑手写一个。 前面写了一个python通过tcp协议发…

linux文件权限常用知识点,基于Linux(openEuler、CentOS8)

目录 知识点常用实例 知识点 真实环境文件显示 解读 常用实例 文件所有者 chown -R nginx:nginx /home/source目录权限(R选填必须大写<遍历子文件夹及文件>) chmod -R 755 /home/sourcechmod -R 777 /home/source

如何使用甘特图来做任务管理?zz-plan甘特图的实践指南

在项目管理和任务调度中&#xff0c;甘特图是一种非常实用的工具&#xff0c;它可以帮助团队成员清晰地规划、执行和跟踪项目进度。然而&#xff0c;如何有效利用甘特图进行任务管理&#xff0c;对于许多团队来说仍然是一个挑战。本文将结合 zz-plan https://zz-plan.com/ 甘特…

重学java 44.多线程 Lock锁的使用

昨日之深渊&#xff0c;今日之浅谈 —— 24.5.25 一、Lock对象的介绍和基本使用 1.概述 Lock是一个接口 2.实现类 ReentrantLock 3.方法 lock()获取锁 unlock()释放锁 4.Lock锁的使用 package S78Lock;import java.util.concurrent.locks.Lock; import java.util.concurrent.lo…

本地图片先压缩,再上传

本地图片先压缩&#xff0c;再上传 叠1压缩 folder_zip_cut1_demo.py import os import shutil import zipfile import datetime# 源目录 source_dir H:\\CCD叠一对齐度图片\\效果图\\ # 日志文件路径 log_file_path D:\\software\\dcs_log\\{}_folder_zip_cut1.log.forma…

【机器学习】大模型在机器学习中的应用:从深度学习到生成式人工智能的演进

&#x1f512;文章目录&#xff1a; &#x1f4a5;1.引言 ☔2.大模型概述 &#x1f6b2;3.大模型在深度学习中的应用 &#x1f6f4;4.大模型在生成式人工智能中的应用 &#x1f44a;5.大模型的挑战与未来展望 &#x1f4a5;1.引言 随着数据量的爆炸性增长和计算能力的提…

【C++】类与对象——多态详解

目录 一、多态的定义 二、重载、覆盖(重写)、隐藏(重定义)的对比 三、析构函数重写 四、C11 override 和 final 1. final 2. override 五、抽象类 六、多态的原理 一、多态的定义 多态是在不同继承关系的类对象&#xff0c;去调用同一函数&#xff0c;产生了不同的行为…

访存优化实践之一 : CPU、GPU、DDR与访存路径介绍

一、CPU的访存路径 上图是目前主流的CPU架构介绍。可以看到,CPU的访存路径:先经过MMU,然后经过Cache,最后到达DRAM。这其中涉及到的关键内容为基于MMU的内存管理以及缓存机制。 1.1、基于MMU的内存管理 众所周知,在计算机设计之处是没有虚拟地址的概念的,CPU发出的地址即…

centos7.9用docker运行一个nginx容器

首先你的linux 系统里面已经安装好了docker&#xff0c;docker的安装教程看这个 1&#xff0c;下载nginx镜像 有很多文章会把镜像下载说成是拉取镜像&#xff0c; 我觉得就是下载的意思啊&#xff0c;搞不懂为什么要说拉取&#xff1f; docker pull nginx 下载最新版 Nginx …