视频流的结构是什么?
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字节代表下一帧等等。
这是 原始 视频流,因此不存在容器元数据或帧封装。只是一个未区分的像素通道值流。
最终目标是处理视频的 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字节代表下一帧等等。
这是 原始 视频流,因此不存在容器元数据或帧封装。只是一个未区分的像素通道值流。