SpringBoot 使用Ffmpeg合并视频

Posted w13511069150

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBoot 使用Ffmpeg合并视频相关的知识,希望对你有一定的参考价值。

一、安装ffmpeg

环境:Docker Centos,进入容器

1.1官网下载 Index of /ffmpeg/release-source

先下载安装包:  wget https://johnvansickle.com/ffmpeg/release-source/ffmpeg-4.1.tar.xz 

建议在宿主机上下载安装包,因为docker中wget的命令都没有。下载并解压成功后,在复制到容器中,下面下载解压等操作在宿主机中执行.

在Linux下经常看到的压缩包为tar.gz的,然后习惯性去用tar命令去解压,今天突然看到个.tar.xz的,当用tar去解压的时候,顺理成章地报错了。。。在centos下可以直接yum install xz,安装完成后,通过xz来解压.xz文件,如xz -d (–decompress) xxx.tar.xz 利用xz解压后的文件为.tar文件,所以接着还需要通过tar来解压 总结一下,彻底解压.tar.xz需要两步:

xz -d ffmpeg-4.1.tar.xz   #先将.xz解压为.tar

tar -xf ffmpeg-4.1.tar   #在将.tar解压

docker cp ffmpeg-4.1 video:/mnt/    #将解压好的文件复制到容器中

1.2安装依赖

yum install -y gcc   

yum install -y yasm

错误1: 

 因为在2022年1月31日,CentOS团队终于从官方镜像中移除CentOS 8的所有包。 CentOS 8已于2021年12月31日寿终正寝,但软件包仍在官方镜像上保留了一段时间。现在他们被转移到https://vault.centos.org 解决方法​ 如果你仍然需要运行你的旧CentOS 8,你可以在/etc/yum.repos中更新repos.d使用vault.centos.org代替mirror.centos.org。参照:CentOS8解决“Failed to download metadata for repo ‘appstream‘”错误_培根芝士的博客-CSDN博客

cd /etc/yum.repos.d
vi CentOS-Linux-BaseOS.repo
vi CentOS-Linux-AppStream.repo

[baseos]
name=CentOS Linux $releasever - BaseOS
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=BaseOS&infra=$infra
#baseurl=http://mirror.centos.org/$contentdir/$releasever/BaseOS/$basearch/os/
baseurl=https://vault.centos.org/centos/$releasever/BaseOS/$basearch/os/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial


[appstream]
name=CentOS Linux $releasever - AppStream
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=AppStream&infra=$infra
#baseurl=http://mirror.centos.org/$contentdir/$releasever/AppStream/$basearch/os/
baseurl=https://vault.centos.org/centos/$releasever/AppStream/$basearch/os/ 
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial

错误2:

  yum install -y epel-release   #产生这个错误的原因是未配置yum源,所以需要安装EPEL源

 发现还是不能安装yasm,那就手动安装吧(还是在宿主机上执行)

wget http://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gz  #下载源码包

tar zxvf yasm-1.3.0.tar.gz #解压

docker cp yasm-1.3.0 video:/mnt/   # 复制到容器

cd yasm-1.3.0 #进入目录

./configure #配置

make && make install #编译安装 如果没有make 命令,可以 yum install -y make 安装

注意:如果涉及到推流或使用h264一定要安装请参照另外的h264安装,

容器安装 libx264_w13511069150的博客-CSDN博客

并且配置为 ./configure --prefix=/usr/local/ffmpeg --enable-gpl --enable-shared --enable-libx264

1.3安装ffmpeg

docker exec -it video bash   #进入容器

/mnt/ffmpeg-4.1   #进入cp进来的目录

./configure --enable-shared --prefix=/usr/local/ffmpeg    #配置

make && make install #编译安装 这个特别慢,需要多等会

vi /etc/ld.so.conf  # 修改文件  增加一行 /usr/local/ffmpeg/lib/  

ldconfig   #使修改生效

/usr/local/ffmpeg/bin/ffmpeg -version  #查看版本

如果:
开启了x264在查看版本时/usr/local/ffmpeg/bin/ffmpeg -version报如下错误

/usr/local/ffmpeg/bin/ffmpeg: error while loading shared libraries: libx264.so.164: cannot open shared object file: No such file or directory

解决:
vi /etc/ld.so.conf   #在最后面加入一行   /usr/local/lib/  
因为发现安装x264库之后,x264的库跑到这里了


vi /etc/profile   #增加环境变量  最后一行增加 如下内容

 PATH=$PATH:/usr/local/ffmpeg/bin

 export PATH  

source /etc/profile  #使配置生效

ffmpeg -version  #查看版本

问题:在容器实例中发现每次重启容器后,ffmpeg命令就不能用发,解决办法

vi ~/.bashrc  配置文件末尾添加 source /etc/profile,保存退出即可。这样就能够实现重启后自动刷新配置文件,而无需手动操作。但是容器跑的JAR文件没法使用ffmpeg命令,因为我是用.sh脚本启动挂载目录的方式,所以在启动.sh文件中也增加 source /etc/profile 就可以了。

 至此ffmpeg 已完装成功。可参照 CentOs7.5安装FFmpeg - wintercloud - 博客园

二、Srping Boot 整合

因为有项目的配置文件,所以项目就不放出来了,可以参照 SpringBoot整合FFmpeg进行视频分片上传(Linux)_upupup-999的博客-CSDN博客

使用 ffmpeg 将平面视频合并为 360 视频

【中文标题】使用 ffmpeg 将平面视频合并为 360 视频【英文标题】:Merging flat videos into a 360 video using ffmpeg 【发布时间】:2022-01-21 14:19:12 【问题描述】:

我有一个 DIY 多摄像头装置;我想用它来使用 ffmpeg 创建 360 度视频。我可以将 单个 视频放入正确的 equirectangular 投影,但似乎无法获得 所有 视频。

我可以使用 ffmpegv360 来转换获取单个视频并将其放置在正确的方向在框架中使用此命令。

ffmpeg -i 1.mp4 -vf v360=output=equirect:input=flat:h_fov=60:v_fov=47.5:yaw=60 -t 2 out.mp4

但是,我似乎无法成功地将 多个 输入视频馈送到 v360,并让它们显示在同一输出视频中。

我尝试使用 filter_complex,然后将它们水平堆叠,但实际上并没有将视频合并在一起 - 它只是创建了 2 个单独的 equirectangular 视频。

ffmpeg -i 1.mp4 -i 2.mp4 -filter_complex '[0:v]v360=output=equirect:input=flat:h_fov=60:v_fov=47.5:yaw=60[first]; [1:v]v360=output=equirect:input=flat:h_fov=60:v_fov=47.5:[second]; [second][first]hstack[out]' -map "[out]" -t 2 out.mp4

叠加层 也不起作用,因为来自 v360 的输出视频在没有视频的图像部分是不透明的。我最终会在输出中显示一个输入视频。

ffmpeg -i 1.mp4 -i 2.mp4 -filter_complex '[0:v]v360=output=equirect:input=flat:h_fov=60:v_fov=47.5:yaw=60[first]; [1:v]v360=output=equirect:input=flat:h_fov=60:v_fov=47.5:[秒]; [second][first]overlay[out]' -map "[out]" -t 2 out.mp4

有没有办法将多个输入视频馈送到单个 v360 equirectangular 过滤器?或者一种使 v360 的空输出透明的方法,这样我就可以使用多个 v360 调用覆盖输出视频,并使用适当的yaw 参数?

提前致谢!

【问题讨论】:

【参考方案1】:

AFAIK,ffmpeg 本身不支持视频拼接。

这通常使用专用的视频拼接软件完成,并且输出通常采用某种格式,即看起来像标准的 mp4 视频,然后其他工具(如 ffmpeg)可以使用。

有一些手动工作流程使用一些开源工具逐帧拼接,但这是一种相当费力的方法 - 您可以在此处查看使用开源 Hugin 图像拼接器 Hugin (http://hugin.sourceforge.net) 的示例(链接在撰写本文时生效):

https://xorgol.medium.com/stitching-multi-camera-360-video-an-open-source-workflow-bb8b1e72925

还有基于现已关闭的 VideoStitch 公司的开源拼接软件。这可以在 GitHub 上找到,但在决定要使用的工具之前,值得检查一下它的支持程度:

https://github.com/stitchEm/stitchEm

【讨论】:

以上是关于SpringBoot 使用Ffmpeg合并视频的主要内容,如果未能解决你的问题,请参考以下文章

如何合并文件夹中的所有视频以使用 FFMPEG 制作单个视频文件

如何在ffmpeg中合并音频和两个视频文件?

ffmpeg合并音频和视频

使用ffmpeg合并视频文件的三种方法

将音频视频与ffmpeg合并时如何提高结果视频的质量?

基于ffmpeg的视频处理汇总