python 将普通文件转换为ts文件,用udp-ts 发送

news/2024/5/18 14:41:46 标签: python, udp, ffmpeg

将普通文件转换为TS文件并使用UDP发送是一个相对复杂的过程,因为你需要遵循TS流的格式来封装原始数据。TS流通常用于封装视频和音频数据,包含固定的包头和负载数据。对于简单的文本或二进制文件,将其转换为TS流并不常见,因为TS是为流媒体设计的。

但是,如果你只是想了解如何模拟这个过程,并且发送一些自定义的数据包,我可以给你一个基本的例子。这个例子中,我们将创建一个简单的TS包格式,并使用UDP发送它。请注意,这个例子只是为了演示目的,并不是真实的TS流。

首先,我们定义一个简单的TS包结构:

 
import struct

def create_ts_packet(pid, payload):
# TS包大小通常为188字节
ts_packet_size = 188
# 包头大小(4字节)
header_size = 4
# 负载大小
payload_size = len(payload)
# 如果负载大小超过184字节,我们需要分割它
if payload_size > (ts_packet_size - header_size):
raise ValueError("Payload is too large for a single TS packet")

# 创建TS包头
# 同步字节(0x47)
sync_byte = 0x47
# 传输错误指示器、优先级指示器、PID、SCR、AFC等字段
# 在这个简单的例子中,我们只设置PID
ts_header = struct.pack('>B', sync_byte) + struct.pack('>H', pid)

# 组合包头和负载
ts_packet = ts_header + payload.ljust(ts_packet_size - header_size - payload_size, b'\0')

# 计算并设置CRC
# 在真实的TS流中,这里应该计算并设置CRC值
# 但为了简化,我们省略这一步

return ts_packet

然后,我们可以创建一个函数来发送TS包:

 
import socket

def send_ts_packet_over_udp(ts_packet, host, port):
# 创建UDP套接字
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# 发送TS包
sock.sendto(ts_packet, (host, port))

# 关闭套接字
sock.close()

最后,我们可以将普通文件内容封装为TS包并发送:

 
def send_file_as_ts_packets(file_path, host, port, pid):
# 打开文件
with open(file_path, 'rb') as file:
# 读取文件内容
file_content = file.read()

# 将文件内容分割为TS包
packet_size = 188 # TS包大小
ts_packets = [file_content[i:i+packet_size] for i in range(0, len(file_content), packet_size)]

# 发送每个TS包
for ts_packet in ts_packets:
send_ts_packet_over_udp(create_ts_packet(pid, ts_packet), host, port)

# 使用示例
send_file_as_ts_packets('example.bin', '127.0.0.1', 12345, 1234) # 假设PID为1234

请记住,这个例子只是为了演示如何模拟发送类似TS包的数据。真正的TS流包含更复杂的包头信息和编码规则,通常用于封装视频和音频流。如果你需要处理真实的TS流,你可能需要使用专门的库(如ffmpeg)来生成和解析TS流。


http://www.niftyadmin.cn/n/5381431.html

相关文章

Netty Review - NIO空轮询及Netty的解决方案源码分析

文章目录 Pre问题说明NIO CodeNetty是如何解决的?源码分析入口源码分析selectCntselectRebuildSelector Pre Netty Review - ServerBootstrap源码解析 Netty Review - NioServerSocketChannel源码分析 Netty Review - 服务端channel注册流程源码解析 问题说明 N…

Android 11以上获取不到第三方app是否安装

开年第一篇&#xff0c;处理了一下年前的小问题。 问题&#xff1a;本地app跳转到第三方app地图进行导航&#xff0c;获取不到第三方地图是否安装。 解决&#xff1a; 1.添加包名 This can be done by adding a <queries> element in the Android manifest.在app下的…

K8S之运用污点、容忍度设置Pod的调度约束

污点、容忍度 污点容忍度 taints 是键值数据&#xff0c;用在节点上&#xff0c;定义污点&#xff1b; tolerations 是键值数据&#xff0c;用在pod上&#xff0c;定义容忍度&#xff0c;能容忍哪些污点。 污点 污点是定义在k8s集群的节点上的键值属性数据&#xff0c;可以决…

C++ bfs反向建图(六十)【第七篇】

今天我们来学习一下bfs反向建图 1.bfs的反向建图 我们之前在图上求最短路都是求从起点出发到每个点的最短路&#xff0c;不过有时候我们也会遇到让求每个点到终点的最短路的问题&#xff0c;此时我们可以怎么做呢&#xff1f; 如果从每个点出发&#xff0c;用 BFS 搜索到终点…

软考学习--计算机组成原理与体系结构

计算机组成原理与体系结构 数据的表示 进制转换 R 进制转换为 10 进制–按权展开法 10进制转换为2进制 原码 反码 补码 移码 原码 &#xff1a;数字的二进制表示反码 &#xff1a; 正数的反码等于原码&#xff0c;负数的反码等于原码取反补码&#xff1a; 正数的补码等…

【每天学习一点点 day04】工程化 npm create 脚手架 create-vue, vue-cli 执行原理① - npm cli

希望我们每个人都能找到属于自己的花期&#xff0c;不急不躁&#xff0c;静等风来。 今天打算用 Docusaurus 开始搭建自己的知识库&#xff0c;之前早已有此想法&#xff0c;遗憾的是没有坚持下来。 这次借助这个机会&#xff0c;也计划将自己【每天学习一点点】系列整理在自己…

Eclipse - 查看工程或者文件的磁盘路径

Eclipse - 查看工程或者文件的磁盘路径 1. Help -> Eclipse Marketplace -> Find: Explorer -> Eclipse Explorer 4.1.0 -> Install2. right-click -> Open in ExplorerReferences 1. Help -> Eclipse Marketplace -> Find: Explorer -> Eclipse Explo…

【C++】编译器如何识别重载函数

文章目录 前言 前言 我们都知道&#xff0c;函数重载即一个函数拥有了多个版本&#xff0c;我们使用时可以通过不同的数据类型区分我们调用的时哪一个重载函数&#xff0c;但编译器编译链接阶段对函数的调用时通过在符号表中寻找唯一名称来确定地址&#xff0c;c时怎么解决了符…