我从第三方应用程序接收到包含原始H264帧和时间戳的打包流。我想获取原始帧和时间戳,然后重新传输,这样我就可以在VLC等播放器中观看视频
我试图只获取原始的H264帧,并通过TCP套接字对其进行流传输,实际上,我能够在VLC中看到视频。但是当然没有时间戳,视频以最大速度播放,然后停止等待其他帧,然后再次以最大速度开始播放。 我想我需要将这些原始帧放入容器中,并用时间戳标记每个帧,但是我不知道如何。 任何帮助(如果使用C#更好)都可以得到
谢谢
答案 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