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">
我的服务器上有一个图像文件,其内容每 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">