【问题标题】:How to create videos from images with php?如何使用 php 从图像创建视频?
【发布时间】:2012-03-05 08:18:22
【问题描述】:

假设我有 10 张图片,我想将这些图片组合成一个视频,例如幻灯片。

例如,我想将每个图像显示 5 秒钟,然后再继续显示下一张图像 5 秒钟。

如果可能的话,最好包含音乐和一些描述性文字。

ffmpeg 库中是否有此示例代码?

【问题讨论】:

    标签: php image-processing ffmpeg video-processing


    【解决方案1】:

    我的第一个想法是使用类似这样的东西来使用 ffmpeg 命令。

    从图像创建视频

    ffmpeg 可用于将多个图像拼接成一个视频。 有很多选择,但是下面的例子应该足够了 开始吧。它需要所有具有文件名的图像 XXXXXX.morph.jpg,其中 X 是数字,并创建一个名为 “输出.mp4”。 qscale 选项指定图片质量(1 是 最高,32 最低),“-r”选项用于 指定每秒的帧数。

    ffmpeg -r 25 -qscale 2 -i %05d.morph.jpg output.mp4

    (获取此简介的网站已消失。链接 已被删除。)

    其中 25 表示每秒 25 张图像。您可以将其设置为 1 以实现轻微(1 秒)延迟或使用小数,即:0.5 以延迟 2 秒。

    然后您可以将视频和音频流与类似的东西结合起来。

    ffmpeg -i video.mp4 -i audio.mp3 -c:v copy -c:a aac -b:a 128k final.mp4
    

    当然要选择合适的编解码器。如果您想要一个 mp4,则将 libx264 用于视频,将 aac(内置于 ffmpeg,不再“实验性”)用于音频。

    请记住,如果您选择使用这样的方法,则 ffmpeg 输出默认情况下会发送到 stderr 以供您尝试读取它。如果您愿意,可以将其重定向到标准输出。

    【讨论】:

    • 好的,所以我们可以选择每秒帧数,但这是否意味着我们可以通过提高 fps 来确定视频的持续时间?例如,如果 25 fps 是 1 秒。使用ffmpeg -r 250 是否意味着每张图像需要 10 秒?
    • 不,它将每秒使用 25 张图像。 25 只是复制/粘贴示例。尝试将其设置为 1 甚至 0.5 并暂停 2 秒。我也将此信息添加到帖子中。
    • @AdilMalik 我删除了链接,这实际上只是为了提供内容的来源。该帖子仍然包含完成任务的相关信息。还做了一些小的内容更新,因为这有点过时了。
    【解决方案2】:

    我首先想到的是imagemagick。我已经将它与 PHP 一起用于大量图像处理,我知道它支持读取相当数量的视频格式,并且根据该链接,它也支持写入一些格式。

    【讨论】:

    • imagick 需要 ffmpeg 所以基本上使用 php 进行视频处理没有优势...
    【解决方案3】:

    是的,ffmpeg 是适合您的解决方案。我最近做了一些类似的东西——一个带有动画缩略图的视频网站。我使用 ffmpeg 将图像放在一个氨基化的 gif 中。然而,输出可以是你需要的任何东西......不幸的是,在我搜索这个主题时,我没有找到任何可以结合你所追求的所有点的示例代码,所以我想你将不得不手动尝试使用 ffmpeg.. . 在我的项目中,我在某些部分使用了 php 视频工具包http://sourceforge.net/projects/phpvideotoolkit/ 以使其更容易...

    【讨论】:

      【解决方案4】:

      你可以在 ffmpeg 中使用混合效果:

      ffmpeg -framerate 20 \
      -loop 1 -t 0.5 -i 1.jpg \
      -loop 1 -t 0.5 -i 2.jpg \
      -loop 1 -t 0.5 -i 3.jpg \
      -loop 1 -t 0.5 -i 4.jpg \
      -c:v libx264 \
      -filter_complex " \
      [1:v][0:v]blend=all_expr='A*(if(gte(T,0.5),1,T/0.5))+B*(1-(if(gte(T,0.5),1,T/0.5)))'[b1v]; \
      [2:v][1:v]blend=all_expr='A*(if(gte(T,0.5),1,T/0.5))+B*(1-(if(gte(T,0.5),1,T/0.5)))'[b2v]; \
      [3:v][2:v]blend=all_expr='A*(if(gte(T,0.5),1,T/0.5))+B*(1-(if(gte(T,0.5),1,T/0.5)))'[b3v]; \
      [0:v][b1v][1:v][b2v][2:v][b3v][3:v]concat=n=7:v=1:a=0,format=yuv420p[v]" -map "[v]" out.mp4
      

      你应该查看下面的链接以获得更多 ffmpeg 的效果:D

      https://github.com/letungit90/ffmpeg_memo

      【讨论】:

        猜你喜欢
        • 2019-04-12
        • 2016-05-01
        • 2012-08-21
        • 1970-01-01
        • 2012-03-13
        • 1970-01-01
        • 2017-08-20
        • 1970-01-01
        相关资源
        最近更新 更多