视频流的结构是什么?

What is the structure of a video stream?

最终目标是处理视频的 RGB 数据。

我正在尝试读取我使用 ffmpeg 创建的文件的字节。

ffmpeg -video_size 100x100 -framerate 20 -f x11grab -i :0.0 \
    -c:v rawvideo -pix_fmt rgb24 -video.nut

我写了一个 node script 来帮助您在需要时更轻松地读取二进制数据。我当前文件的输出是:

Hex Binary   Row
47  01000111 0
40  01000000 1
11  00010001 2
10  00010000 3
03  00000011 4
00  00000000 5
00  00000000 6
00  00000000 7
68  01101000 8 

我看到了the spec for a .nut,但我想不通。我希望能够解析出每一帧的 RGB 数据,以便为视频流中的每个 "image" 留下一个 RGB 矩阵。谢谢!

就我个人而言,我喜欢@Mulvya 的回答。 .rgb 格式要容易得多。然而,如果你传递那个文件,你将不得不总是包括它的注释(例如:预期的宽度、高度、帧率等),否则它是一个字节的海洋,不知道每帧停止的位置。

至于你之前问的 .nut 格式...

每个视频帧都将被归类为关键帧(因为它是未压缩的完整图像)。

  • 首先找到关键帧的数据部分...寻找这样的起始代码序列:
    4E 4B E4 AD EE CA 45 69

  • 为确保这是关键帧数据部分,接下来的 8 个字节始终设置为:
    06 00 00 00 00 00 00 03.

  • 接下来的字节包含标志和用于此关键帧的总字节数(即:30000 用于 100 x 100 x 3 图像)。它变得棘手,因为现在你必须在位级别而不只是字节级别进行检查......这个故事的简短版本是(对于 100 x 100 图像)只是跳过接下来的 4 个字节,这应该是00 81 EA 30 获取 30 000 字节的 RGB 数据。 等为:

    (a) 第一帧跳过 4 个字节(应该是 00 81 EA 30)+ 提取以下 30 000 个字节。

    (b) 这导致另一个关键帧代码:4E 4B E4 AD EE CA 45 69。接下来是 15 个可跳过的字节(其中最后一个是 30),您将获得 30K 的图像 RGB 数据。

    (c) 对于所有其他帧,重复步骤 (b),由此您:跳过 8 字节的起始代码 + 跳过 15[=83 之后的下一个=] 字节 + 提取图像的下一个 30 000 字节。重复直到结束。

    • PS:最后一点……这 4 个字节只有 4 个,因为定义(标志等)100 x 100 图像所需的总位数。更多的位将用于更大尺寸的图像。在这种情况下,您真的要解析各个位,以及帧数据之前的最后一位,总是给出图像提取所需的字节大小。如果您需要该信息,请告诉我。

旧答案

I can't figure out what format the payload is in. I checked wikipedia for uncompressed video format, but that was no help...

-f mpegts 表示 强制 输出格式为 mpegts 而不管文件扩展名。
所以你真的有 MPEG TS 格式,它从来不是 RAW 格式。 您文件名中的 3 个字母 r-a-w 具有误导性。

当你只说"uncompressed video"时,我无法确定你实际需要什么格式。你想要的是RGB吗?我只知道 AVI 和 FLV 是支持 RGB 帧的格式(MOV 可能也可以,但从未尝试过)。无论如何,您需要一个 容器 来存放您的 RGB 帧数据

AVI 容器:

ffmpeg -video_size 1920x1080 -framerate 30 -f x11grab -i :0.0 -c:v rawvideo -pix_fmt rgb24 video.avi

FLV 容器:

ffmpeg -video_size 1920x1080 -framerate 30 -f x11grab -i :0.0 -c:v flashsv -pix_fmt rgb24 video.flv


PS : 也许 this answer 中的信息可以帮助您决定输出格式和容器。

如果您可以解析原始视频,请使用

ffmpeg -video_size 100x100 -framerate 20 -f x11grab -i :0.0
       -c:v rawvideo -pix_fmt rgb24 -f rawvideo video.rgb

输出的结构将是

R G B R G B R G B ...

所以每个三字节三元组代表一个像素,扫描顺序为从左到右,从上到下。因此,对于 100x100 帧,第 301 个字节是第 2 行第一个像素的 R 值。第 30000 个字节是右下角像素的 B 值。然后接下来的30K字节代表下一帧等等。

这是 原始 视频流,因此不存在容器元数据或帧封装。只是一个未区分的像素通道值流。