代码之家  ›  专栏  ›  技术社区  ›  Robert Campbell

如何从Java中的FLV文件中编程地提取一个预览图像——像第一帧?

  •  1
  • Robert Campbell  · 技术社区  · 15 年前

    更新:

    既然我最初的请求看起来几乎是不可能的,那么下一个最简单的解决方案是什么?调用swftools应用程序?调用ffmpeg lib?

    原件:

    这与 how to extract flash frames programmatically “但是我 仅限于Java库(并且没有JNI调用C)。这也意味着不需要像 swftools . 我正在寻找一个纯Java(或至少JVM)解决方案。

    3 回复  |  直到 15 年前
        1
  •  3
  •   Art Clarke    15 年前

    或者,如果您想直接从Java中执行它,您可以使用 this code . 它使用 Xuggler 一个用于从Java中编码和解码视频的开源库。Xugler确实在幕后使用JNI来进行ffmpeg,但是当使用它时,您完全看不到它。跳起来有帮助。

    艺术

        2
  •  3
  •   Stu Thompson Helter Scelter    15 年前

    有可能… 如果您可以接受最终结果是一个帧的flv文件(而不是一个正确的图像,如png或jpeg),那么单帧视频到底是什么?这是一个图像!这可能很好地为您提供了所需的功能,尽管看起来有点奇怪。

    您需要做的是解析FLV文件。它实际上是一种非常简单的格式。首先,阅读一些基本的 video compression terms . 第二,阅读 FLV File Format specification 在Adobe的网站上。

    大致上,一个示例flv文件在内部如下所示:

    'FLV' header
    Meta data 
    Frame 0 - Audio
    Frame 1 - Video I-Frame (all information to create a full image) 
    Frame 2 - Video P-Frame (just differential from last frame)
    Frame 3 - Video P-Frame (just differential from last frame)
    Frame 1 - Video I-Frame (all information to create a full image) 
    Frame 2 - Video P-Frame (just differential from last frame)
    Frame 3 - Video P-Frame (just differential from last frame)
    Frame 0 - Audio
    Frame 5 
    ...
    Frame n
    EOF
    

    因此,您将搜索想要的视频i帧作为图片。这,连同一个基本的FLV文件头,一起是您所需要的。我们的输出(无论是套接字还是文件)将只是:

    'FLV' header
    Frame 0 - Video I-Frame (all information to create a full image) 
    

    这一切都可以在Java中完成,没有任何特殊的工具。 我自己做的。是真的。

    请注意,此方法仅适用于FLV文件,而不适用于F4V(或其他基于MP4的文件格式)。

        3
  •  1
  •   Vladimir Dyuzhev    15 年前

    请注意,SWF中的回放是由actionscript和声明性转换控制的,因此要正确地查看“第一帧”,在任何情况下都需要模拟整个播放器。我会说——调用外部工具。他们怎么了?这是宗教规定的吗?