PHP 如何从单个动态图像创建视频流

How to create a video stream from a single dynamic image in PHP

我的服务器上有一个图像文件,其内容每 100 毫秒更改一次。

我可以像往常一样加载和提供这张图片:

$image = file_get_contents('path/to/image.jpg');
header('Content-type: image/jpeg');
echo $image;
<img src="image.php">

因此,每次用户更新屏幕(例如按 F5)时,服务器都会回复不同的图像。我还可以使用 Java 脚本(例如使用 setInterval)来不断更新图像,这样用户就不需要自己更新屏幕了。

但是,我需要将此图像作为连续流(例如实时视频流)提供,以便显示为 HTML5 视频而不是静态图像。

目前我发现的一些示例使用 PHP-FFMpeg 库来播放视频。事实证明,这些示例要求我手头有一个视频文件(OS 中的文件或 URL 中的文件)而不是我上面描述的单个(动态)图像.

我找到 this example 如何使用 PHP 进行流式传输。它看起来很有希望。但是代码再次假设我有一个视频文件 url 但我没有。

我想知道是否可以根据我的需要调整此代码。比如setHeader()方法如何适配没有begin和end的场景?考虑到我已经使用 file_get_contents 左右加载了图像内容,如何正确更改 stream() ?或者,另一方面,还有其他方法可以将此图像作为视频流提供吗?

下面的代码应该每 200 毫秒重新加载一次图像。添加随机数可避免任何潜在的缓存,因为您请求的是 PHP 页面。

<html>
    <header>
    
        <script>
        
            function ReloadImage()
            {
                var image_element = document.getElementById('image_id');
                
                image_element.src = 'image.php?rand=' + Math.random();
            }

            setInterval(ReloadImage,200);
        
        </script>
        
    </header>

    <body>

        <img src="image.php" id="image_id">
        
    </body>

</html>

好吧,我刚刚找到了满足我需求的解决方案:

$identifier = "an_identifier";

//set headers
header('Accept-Range: bytes');
header('Connection: close');
header('Content-Type: multipart/x-mixed-replace;boundary=' . $identifier);
header('Cache-Control: no-cache');

// loop to continuously serve an image
while(true) {

    $image = load_image_contents();

    echo "--" . $identifier . "\r\nContent-Type: image/jpeg\r\nContent-Length: ".strlen($image)."\r\n\r\n".$image;
    flush();
    usleep(50000);

}

在浏览器端我只是设置了一个常规的图片标签:

<img src="image.php">