当我有原始H264帧和时间戳时,如何创建视频流?

时间:2019-06-05 18:25:39

标签: c# video-streaming h.264 video-processing

我从第三方应用程序接收到包含原始H264帧和时间戳的打包流。我想获取原始帧和时间戳,然后重新传输,这样我就可以在VLC等播放器中观看视频

我试图只获取原始的H264帧,并通过TCP套接字对其进行流传输,实际上,我能够在VLC中看到视频。但是当然没有时间戳,视频以最大速度播放,然后停止等待其他帧,然后再次以最大速度开始播放。 我想我需要将这些原始帧放入容器中,并用时间戳标记每个帧,但是我不知道如何。 任何帮助(如果使用C#更好)都可以得到

谢谢

1 个答案:

答案 0 :(得分:0)

(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到另一个{{1}的序列的最后一个字节)中获取所有字节。 }}开始。这应该*是您要发送的帧数据。

注释:
我说“应该” 是因为H264有时会对图像进行切片,因此,如果您发送一帧并仅获得一半的图片,则意味着您必须将两个或三个NAL单元序列作为一个整体发送(例如:放在一个字节数组中)以查看完整图像。您将通过积极的实验学习。

(2)选项2:管道
尝试FFmpeg免费的命令行工具。实际上,它也是VLC的音频/视频解码器。您可以使用C#的标准输入/输出将接收到的字节发送到FFmpeg(作为进程正在使用编码器设置例如的输出格式和分辨率运行)。

以本文为起点:
https://mathewsachin.github.io/blog/2017/07/28/ffmpeg-pipe-csharp.html