视频流的结构是什么?

时间:2016-06-16 19:48:30

标签: video ffmpeg video-processing

最终目标是处理视频的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数据,这样我就可以为每个"图像"留下一个RGB矩阵。在视频流中。谢谢!

2 个答案:

答案 0 :(得分:3)

就个人而言,我喜欢@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数据。 et as:

    (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 字节后的下一个<提取下一个 30 000 字节用于图像。重复直到结束。

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

OLD ANSWER

  

我无法弄清楚有效载荷的格式。我检查了维基百科   对于未压缩的视频格式,但这没有帮助...

无论文件扩展名为何,

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

当您只说“未压缩的视频”时,我无法确定您实际需要的格式。你想要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 中的信息可以帮助您确定输出格式和输出格式。容器

答案 1 :(得分:2)

如果您对解析原始视频感到满意,请使用

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字节代表下一帧,依此类推。

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