最终目标是处理视频的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矩阵。在视频流中。谢谢!
答案 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 字节用于图像。重复直到结束。
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字节代表下一帧,依此类推。
这是原始视频流,因此不存在容器元数据或帧封装。只是一个无差别的像素通道值流。