利用ffmpeg将无命名规则的静态图片合成视频

众所周知,ffmpeg将图片合成视频的正常指令一般是这样的
ffmpeg -i picture/img-.jpg -vcodec mpeg4 video.avi
-i指的是输入文件
picture/img-.jpg指的是在picture目录下,将imgxx.jpg的所有图片合成视频。其中,xx代表2位整型数字。下面说一下ffmpeg是如何解析这条输入文件指令的。
1、在libavformat/img2.c文件下,通过find_image_range函数找出picture目录下第一张开始输入的图片名称,然后算出最后一张图片的名称。比如,我在picture目录下方的图片有img00.jpg、 img01.jpg、 img02.jpg。那通过这个函数就可以知道第一张开始读入的图片名称是 img00.jpg,最后一张读入的图片名称是 img02.jpg。执行完此函数之后,将图片下标00赋值给first_index,将02赋值给last_index,img_number表示当前所读到的图片的下标
2、在img2.c下的read_packet函数中,开始真正读取图片的信息。通过调用av_get_frame_filename函数得到当前应该读取的图片的文件名,然后调用相应函数进行图片信息的读取。最后img_number++,指向下一张待读取的图片的下标。

从以上的分析可知,这种图片合成视频的方法非常受限制,只能将某目录下具有一定命名规则的静态图片合成视频。如果我要将不同目录下不同命名规则的多张静态图片合成一个视频,显然这种方式是行不通的。好在ffmpeg还提供了一个方法,那就是通过image2pipe方式读取。先上个命令
ffmpeg -f image2pipe -r 10 -vcodec mjpeg -i /tmp/my_fifo -vcodecmpeg4 video.avi
-f强制指定了输入文件的格式,就是从流中读取数据
-r指定了帧率
-vcodec应该是指定了该流的文件格式
/tmp/my_fifo 是自己提前创建好的fifo,通过mkfifo /tmp/my_fifo创建
执行这条指令之后,ffmpeg会阻塞监听直到my_fifo中有数据并且pipe关闭为止
此时我们要做的就是往my_fifo中提交数据。其实就是将要合成视频的图片cat到my_fifo中去即可
如果额外添加音频文件的话,记得额外指定音频格式,即在后边的mpeg4后边加一个参数 -vcodecacc3即可。不指定音频格式的话会报错,因为my_fifo的图片流格式是mjpeg,与音频文件的格式不符,一起读入的话会有问题

以上就是自己在弄ffmpeg的时候的一些总结,欢迎大家拍砖
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值