代码之家  ›  专栏  ›  技术社区  ›  Shubham AgaRwal

ffmpeg:在视频创建过程中添加背景图像

  •  0
  • Shubham AgaRwal  · 技术社区  · 8 年前

    关于我之前的问题 FFMpeg: merge images with audio for specific duration 我使用以下命令成功地将一些图像与音频合并到特定的持续时间内。

    ffmpeg \
    -y \
    -f concat \
    -safe 0 \
    -r 1/5 \
    -i concat.txt \
    -i audio.ogg \
    -c:v libx264 \
    -profile:v high \
    -crf 17 \
    -preset ultrafast \
    -strict experimental \
    -t 15 \
    output.mp4
    

    为了添加背景图像,我尝试使用 https://superuser.com/a/876275/299733 以及网络上存在的其他解决方案。但是给定的解决方案并没有正确地覆盖我的图像,我在整个过程中都得到了黑色视频。因此,我再次通过以下方式对先前命令生成的视频进行编码:

    ffmpeg \
    -y \
    -loop 1 \
    -i bg.jpg \
    -i output.mp4 \
    -filter_complex "overlay=(W-w)/2:(H-h)/2:shortest=1,format=yuv420p" \
    -c:v libx264 \
    -profile:v high \
    -crf 17 \
    -preset ultrafast \
    -strict experimental \
    -t 15 \
    output2.mp4
    

    现在,我能得到想要的结果了。有没有办法把两个请求合并成一个传递?或者是一个更好的不损失任何性能的方法?

    其他详细信息:

    concat.txt文件

    file '/home/shubham/Desktop/FFMpeg/image_1.jpg'
    file '/home/shubham/Desktop/FFMpeg/image_2.jpg'
    file '/home/shubham/Desktop/FFMpeg/image_3.jpg'
    

    基于@gyan响应

    已更新concat.xml:

    file '/home/shubham/Desktop/FFMpeg/image_4.jpg'
    duration 5
    file '/home/shubham/Desktop/FFMpeg/image_5.jpg'
    duration 5
    file '/home/shubham/Desktop/FFMpeg/image_6.jpg'
    duration 5
    file '/home/shubham/Desktop/FFMpeg/image_6.jpg'
    

    更新的命令:

    ffmpeg \
    -y \
    -loop 1 \
    -i bg.jpg \
    -f concat \
    -safe 0 \
    -i concat.txt \
    -i audio.ogg \
    -filter_complex "[1]fps=25[v];[0][v]overlay=(W-w)/2:(H-h)/2:shortest=1,format=yuv420p" \
    -c:v libx264 \
    -profile:v high \
    -crf 17 \
    -preset ultrafast \
    -strict experimental \
    -t 15 \
    output.mp4
    

    问题是,当图像具有不同的分辨率,甚至具有相同的分辨率时,图像将被跳过。大多数时候最后一张照片都会显示出来。但是,没有选择哪个图像和跳过哪个图像的条件。 样品: https://drive.google.com/file/d/1JxCsV2eudKzdgWWuefXqdaWPaBf9Dzzd/view?usp=sharing

    但是,如果我重复使用相同的图像或复制图像并重命名它。在这两种情况下,我得到了正确的背景图像没有任何跳过。

    编辑:2018年7月9日

    正如@gyan在评论中所说: 将每个图像转换为相同的分辨率和类型。 我检查图像的信息。通过

     ffmpeg -i image_X.jpg
    

    发现两幅图像的编码不同:

    图1: 流0:0:视频:MJPEG,Yuvj420P(PC,BT470BG/未知/未知),640x480[sar 72:72 DAR 4:3],25 tbr,25 tbn,25 tbc

    图2: 流0:0:视频:MJPEG,Yuvj444P(PC,BT470BG/未知/未知),640x480[sar 72:72 DAR 4:3],25 tbr,25 tbn,25 tbc

    这可能是合并失败的原因。

    1 回复  |  直到 8 年前
        1
  •  1
  •   Gyan    8 年前

    使用

    ffmpeg \
    -y \
    -loop 1 \
    -i bg.jpg \
    -f concat \
    -safe 0 \
    -r 1/5 \
    -i concat.txt \
    -i audio.ogg \
    -filter_complex "[1]fps=25[v];[0][v]overlay=(W-w)/2:(H-h)/2:shortest=1,format=yuv420p" \
    -c:v libx264 \
    -profile:v high \
    -crf 17 \
    -preset ultrafast \
    -strict experimental \
    -t 15 \
    output.mp4
    

    concat demuxer将其第一个输入的属性(如编解码器、分辨率、时基等)注册为其demuxed流属性。因此,为了获得可靠的结果,所有输入都应该具有相同的属性。

    推荐文章