[英]How to create a video stream when I have raw H264 frames and timestamps?
我从第三方应用程序收到一个包含原始 H264 帧和时间戳的 stream 数据包。 我想获取原始帧和时间戳并重新流式传输,这样我就可以在像 VLC 这样的播放器中看到视频
我试图在原始 H264 帧到达时获取它们,并通过 TCP 套接字将它们转换为 stream,我实际上能够在 VLC 中看到视频。 但是当然没有时间戳,视频以最大速度播放,然后停止等待其他帧,然后以最大速度再次开始播放。 我想我需要将这些原始帧放在一个容器中并用时间戳标记每个帧,但我不知道如何做。 感谢任何帮助(如果在 C# 中更好)
谢谢
(1)选项 1:定时器
只需使用计时器发送您的个人 H264 帧。
timer_delay = (1000/FPS); //if FPS is 30, then sends a frame every 33 milliseconds.
一个帧(NAL 单元)有一个四字节的起始码,如00 00 00 00
因此在另一个序列00 00 00 00
开始之前,从一个序列(包括00 00 00 00
到最后一个字节)抓取所有字节。 这应该*是您要发送的帧数据。
笔记:
我说“应该”是因为 H264 有时会对图像进行切片,所以如果您发送一帧并只得到半张图片,这意味着您必须将两到三个 NAL 单元序列作为一个整体发送(例如:在一个字节数组中)才能看到一个完整的图像。 您将通过积极的实验来学习。
(2)选项 2:管道
试试FFmpeg一个免费的命令行工具。 实际上它也是 VLC 的音频/视频解码器。 您可以使用 C# 的标准输入/输出将接收到的字节发送到 FFmpeg(作为一个进程正在使用编码器设置运行,例如:输出格式和分辨率等)。
请参阅这篇文章作为起点:
https://mathewsachin.github.io/blog/2017/07/28/ffmpeg-pipe-csharp.html
帧可以是三个或四个字节的定界符(长或短),具体取决于编码器。 然而,每个样本(即 IDR 和非 IDR 帧的集合)都有 4 个字节的起始序列 00 00 00 01。请参阅 RFC 文档了解详细信息。 您可以将帧收集到一个样本中,并可以通过 RTP/RTSP 发送它。 Gstreamer 具有良好的 RTP 能力。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.