1

我很有可能会走上一条毫无意义的道路,所以如果这是浪费时间,我深表歉意。我一直在尝试将未压缩的视频写入 FLV 文件,但不确定是否可行。

根据维基百科,有效的视频编码选项为 0,表示“RGB”视频编码:https ://en.wikipedia.org/wiki/Flash_Video#Packets 。但是,我在 Adob​​e 的文档中没有看到任何提及此 Codec ID 选项的内容。既不是“视频文件格式规范第 10 版”也不是“Adobe Flash 视频文件格式规范第 10.1 版”。

我假设允许使用 0/RGB 编解码器 ID。我在 C 中硬编码了一个 unsigned char 数组,并使用 fwrite 将以下 Double/Number 元数据写入一个新的二进制 FLV 文件(诚然,我假设我写得正确):

  • 持续时间:4(秒)
  • 宽度:16(像素)
  • 高度:16(像素)
  • 视频数据速率:6 (Kbps)
  • 帧率:1 (fps)
  • 视频编解码器:0
  • 文件大小:3323(字节)

然后我添加了 4 个 VIDEODATA 标签,每个我希望写入的 RGB 帧 1 个。它们的时间戳是 0、1000、2000 和 3000(毫秒)。它们都有一个 769 字节的有效载荷:第一个字节指定它是一个 Codec ID 为 0 的关键帧,其余的 768 个用于表示 16x16x3 (RGB) 图像。我为所有值写了 255/0xFF,希望看到一个小的白色屏幕出现 4 秒。

当我担心在 VLC 媒体播放器中无法正确播放时,我尝试为每一帧使用 RGBA 颜色。我还将 videodatarate 和 filesize 元数据分别更改为数值 8 (Kbps) 和 4347 (bytes)。

不幸的是,这也没有在 VLC 媒体播放器中播放。我想知道是否有人确定 FLV 文件中的未压缩视频是否可行?如果是这样,我很好奇视频数据应该是什么格式(RGB、RGBA、多个 VIDEODATA 标签、只有一个 VIDEODATA 标签等)?

我的 C 代码主要是一个巨大的 unsigned char 数组,但如果有人想查看它,我可以尝试添加它。任何意见是极大的赞赏。

谢谢,

米切尔一个

4

2 回答 2

1

根据 SirDarius,“维基百科页面中列出的视频编码类型并非来自官方来源。我不建议依赖这些。” 这是有道理的,因为 Adob​​e 本身的 FLV 格式文档没有提到视频编码的未压缩 RGB 选项。

我一直希望维基百科的编辑和其他人知道一些 FLV 格式的未记录的复活节彩蛋,但我现在确信情况并非如此。

于 2019-01-29T06:38:16.360 回答
1

“...Adobe 本身的 FLV 格式文档没有提到
视频编码的未压缩 RGB 选项。”

对于 RGB(原始位图数据),您必须使用Screen 1编解码器 (id=3)。

奇怪的是,它隐藏在SWF格式文档(不是 FLV 格式文档)中。
请参阅第 14 章(第 204 页),即视频部分...

  • 您希望特别在第 208 页Screen Video上解释编解码器。

  • 检查将 RGB 编码为屏幕视频的示例代码(AS3)。

应用逻辑,尤其是函数videoData(),可以调整它以读取像素单位(通过某种getPixel类型调用)或仅从Array.

例子:

for (var x2:int = 0; x2 < xLimit; x2++) 
{
    var px:int = (x1 * blockWidth) + x2;
    var py:int = frameHeight - ((y1 * blockHeight) + y2); // (flv's save image from bottom to top)

    var p:uint = YOUR_INPUT_BITMAP.getPixel(px, py); // sample a pixel's RGB (3-bytes unsigned int) 

    //# IF reading from Pixel's uint value
    block.writeByte( p & 0xff );        // blue 
    block.writeByte( p >> 8 & 0xff );   // green
    block.writeByte( p >> 16 );         // red

    //# ELSE IF reading from Array of R-G-B values(FLV writes in BGR format)
    block.writeByte( myRGB_Array[x+2] );        // blue 
    block.writeByte( myRGB_Array[x+1] );    // green
    block.writeByte( myRGB_Array[x] );  // red

}
于 2019-02-04T19:17:42.607 回答