FFMpeg 将 jpg 图像转换为视频

FFMpeg 将 jpg 图像转换为视频

我正在尝试拍摄一组以 1 秒为间隔的图像以形成缩时视频。我以为使用 ffmpeg 可以轻松完成此操作,但我遇到了神秘的错误。

所有图片都是 yuv420 jpeg,由 Android 相机拍摄。它们以单独的 jpeg 格式保存在一个文件夹中,大小和格式都相同。它们以 7 位数字的序列命名,从零开始(例如,从“0000000.jpg”到“0001000.jpg”)。

这是我的字符串(为了清晰起见,文件夹名称已删除):

avconv -r 1 -f image2 -i %07d.jpg -vcodec libx264 -crf 18 -preset slower video.mp4

看起来很棒,我看到很多人发帖说这对他们有用。

但是 ffmpeg 给了我这个(粗体表示错误)

ffmpeg 版本 0.8.5-6:0.8.5-1,版权所有 (c) 2000-2012 Libav 开发人员
  于 2013 年 1 月 13 日 12:05:48 使用 gcc 4.7.2 构建
*** 此程序已弃用 ***
此程序仅用于兼容性目的,将在以后的版本中删除。请使用 avconv 代替。
[mjpeg @ 0x233aea0] 过度读取 8
输入 #0,图像 2,来自'%07d.jpg':
  时长:00:00:00.04,开始:0.000000,比特率:N/A
    流 #0.0:视频:mjpeg、yuvj420p、640x480 [PAR 1:1 DAR 4:3]、25 tbr、25 tbn、25 tbc
文件“video.mp4”已存在。覆盖吗?[y/N] y
[缓冲区@0x233b340] w:640 h:480 pixfmt:yuvj420p
[libx264 @ 0x2339fa0] 使用 SAR=1/1
[libx264 @ 0x2339fa0] 使用 CPU 功能:MMX2 SSE2Fast FastShuffle SSEMisalign LZCNT
[libx264 @ 0x2339fa0] 配置文件 Main,级别 3.1
[libx264 @ 0x2339fa0] 264 - 核心 123 r2189 35cf912 - H.264/MPEG-4 AVC 编解码器 - Copyleft 2003-2012 - http://www.videolan.org/x264.html - 选项:cabac=1 ref=8 deblock=1:0:0 analyze=0x1:0x131 me=umh subme=9 psy=1 psy_rd=1.00:0.00 hybrid_ref=0 me_range=16 chroma_me=1 trellis=2 8x8dct=0 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2threads=1sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=0 b_adapt=2 b_bias=0 direct=3 weightb=0 open_gop=1 weightp=2 keyint=250 keyint_min=25 scenecut=40 intra_refresh=0 rc_lookahead=60 rc=crf mbtree=1 crf=18.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.25 aq=1:1.00
输出 #0,mp4,到‘video.mp4’:
  元数据:
    编码器:Lavf53.21.1
    流 #0.0:视频:libx264、yuvj420p、640x480 [PAR 1:1 DAR 4:3]、q=-1--1、25 tbn、25 tbc
流映射:
  流 #0.0 -> #0.0
按 ctrl-c 停止编码
[mjpeg @ 0x233aea0] 过度读取 8
帧= 0 fps= 0 q=0.0 Lsize= 0kB 时间=10000000000.00 比特率= 0.0kbits/s    
视频:0kB 音频:0kB 全局标头:0kB 多路复用开销 610.000000%

导入行(显示为红色)的内容是“[mjpeg @ 0x233aea0] 过度读取 8“。

这让我想到,也许它试图将图像读取为运动 jpeg 而不是普通 jpeg 文件,但不知何故失败了。我尝试过使用/不使用“-f image2”,结果相同。我也尝试过使用 avconv,结果相同。

我应该注意,这些图像是有效的,如果我将它们全部转换为 *.png(一个昂贵且耗时的过程),整个过程就可以正常工作。但我更希望只使用 jpeg,而不需要中间转换。毕竟,这就是 ffmpeg 的用途,转码。

有没有人有使用 ffmpeg 将 *.jpg 转换为视频的好方法?

答案1

[mjpeg @ 0x233aea0] overread 8ffmpeg是在尝试逐块读取 JPEG 图像(或来自 MJPEG 流的帧)但仍有剩余位时引发的错误。

在这种情况下,即使您的图像在其他查看器中显示正常,FFmpeg 也无法(或不会)处理。要解决此问题,您需要重新保存图像,可以像之前尝试的那样保存为 PNG,也可以保存为 JPEG。您可以使用以下方式进行这种批量转换图像魔术师, 例如:

for f in *.JPG; do mogrify "$f"; done

这将以相同的名称重新保存 JPEG 文件。请注意,在此过程中您将损失质量,因此这不是理想的选择,我会选择 PNG 作为中间文件,因为它们是无损的。

顺便说一句:使用最新版本的 FFmpeg 总是一个好主意,你可以下载为静态构建(只需下载、提取、使用)或自己编译Ubuntu 自带的软件包总是过时的,而且——取决于你的 Ubuntu 版本——甚至不是“真正的”FFmpeg,而是 Libav fork(可以使用,但应该知道区别)。

%07d.jpg不要忘记,使用语法时,图像需要有连续的名称ffmpeg,并且不能缺少数字。另请参阅文档image2多路复用器上获得更多选项。

相关内容