Video 使用avconv在设定时间从h264视频中获取单帧
我想使用avconv在指定时间从视频文件中获取单个图像 关于libav,我已经读了足够多的书,以为我知道自己在做什么,但还不足以真正知道 我试过:Video 使用avconv在设定时间从h264视频中获取单帧,video,ffmpeg,raspberry-pi,raspbian,avconv,Video,Ffmpeg,Raspberry Pi,Raspbian,Avconv,我想使用avconv在指定时间从视频文件中获取单个图像 关于libav,我已经读了足够多的书,以为我知道自己在做什么,但还不足以真正知道 我试过: avconv -ss 00:00:01.786 -r 25 -i input_video.h264 -frames 1 output_image.jpg 以及使用t来避免“frames”参数: avconv -ss 00:00:01.786 -r 25 -i input_video.h264 -t 0.01 output_image.jpg 以秒
avconv -ss 00:00:01.786 -r 25 -i input_video.h264 -frames 1 output_image.jpg
以及使用t来避免“frames”参数:
avconv -ss 00:00:01.786 -r 25 -i input_video.h264 -t 0.01 output_image.jpg
以秒为单位传递,而不是使用hh:mm:ss.xxx格式:
avconv -ss 1.786 -r 25 -i input_video.h264 -t 0.01 output_image.jpg
我看到的是,当ss设置为0(即“0”、“00:00:00.000”、“0.0”等)时,输出的图像只是视频的第一帧。正如所料
ss的任何其他值(即使是0.0001)都会给出视频的最后一帧
我用的是Raspbian哮鸣音反应器的最新avconv。这种行为对我来说就像一个bug,但我对视频流的其他复杂性还不太了解,无法确定
有人知道我做错了什么吗
附加问题:我真的很想从同一个视频中得到一大堆这样的图像。将命令串在一起以前似乎是可行的,即:
avconv -ss 1.786 -r 25 -i input_video.h264 -t 0.01 output_image1.jpg
-ss 3.454 -r 25 -i input_video.h264 -t 0.01 output_image2.jpg
-ss 5.823 -r 25 -i input_video.h264 -t 0.01 output_image3.jpg
-ss etc,etc.
但我切换回单个图像来调试这个问题。假设第一个问题得到解决,这是构造此命令的最佳方法还是有更好的方法?在我的情况下,我希望在前3分钟内每60秒生成一个图像 对于{0..3}中的i;do avconv-ss
echo$i*60.0 | bc
-i input_video.h264-帧:v1-y out$i.jpg;完成
如果你需要它的某一特定时间,你可以改变这一点:9
编辑:正如Mulvya所指出的,ffmpeg将始终使用-ss精确搜索。本期为avconv独家发行
如果在-i
选项之前指定-ss
选项,则avconv将不准确地计算帧位置
您需要首先指定-i
选项,以便avconv知道它需要在流中“搜索”,直到它准确地找到正确的时间戳
此外,示例时间1.786
未与示例中指定的每秒帧数-r 25
对齐
由于1/25=0.04
因此-ss
的任何值都应该可以被0.04
整除,以便精确指定单个帧
以下内容应为视频的第46帧:
avconv-i input\u video.h264-r25-ss1.8-frames:v1 output\u image.jpg
如果希望通过索引获取特定帧,则需要采用bc
:
avconv-i input_video.h264-r25-ss0$(echo“scale=2;1000/25”| bc-l)-帧:v1输出_image.jpg
其中1000
是视频的第1001帧(因为0/25
是第一帧)
请注意,与@hamboy75的示例不同,我们将-l
(小写l)传递给bc
,以便它执行浮点计算(并且不舍入到最接近的整数)<代码>比例=2用于生成精确到2dp的数字
还请注意,bc
具有输出小于1的数字而不带前导零的“功能”(即,.04
),这是avconv不理解的。因此,我们还需要在计算前插入一个前导零0$()
使用此命令时,您将获得如下输出
frame= 0 fps= 0 q=0.0 size= 0kB time=10000000000.00 bitrate= 0.0kbit
frame= 0 fps= 0 q=0.0 size= 0kB time=10000000000.00 bitrate= 0.0kbit
frame= 0 fps= 0 q=0.0 size= 0kB time=10000000000.00 bitrate= 0.0kbit
frame= 0 fps= 0 q=0.0 size= 0kB time=10000000000.00 bitrate= 0.0kbit
frame= 0 fps= 0 q=0.0 size= 0kB time=10000000000.00 bitrate= 0.0kbit
这是因为avconv正在查找文件,以准确地找到您请求的特定帧。因此,索引越大的帧提取时间越长,因为avconv将始终从流的开始“搜索”流
因此,可能更希望提取一系列帧:
avconv-i input_video.h264-r25-ss0$(echo“scale=2;7500/25”| bc-l)-t0$(echo“scale=2;250/25”| bc-l)输出_图像U04d.jpg
此示例从视频中的5分钟中提取10秒的帧。当然,您也可以使用:
avconv-i输入video.h264-r25-ss300.0-t10.0 | bc-l)输出u图像04d.jpg
但是,请记住,在任何小于1秒的持续时间内,该值都应可被视频的帧速率整除(即,25 fps的0.04
)
<> P>每个帧的图像将被命名为<代码> OutPuxIMAGEY0100.JPG,<代码> OutPuxIMAGEY09000. JPG,<代码> OutPuxIMAGEY03.03JPG等。如果您想在提取的帧上执行图像比较,您可能需要考虑使用<代码> PNG < /C> > <代码> JPG>代码>以获得更大的保真度。
请注意,如果指定的帧索引大于视频中的帧数,avconv将只提取找到的最后一帧。您可能希望通过查看
avconv-i input_video的输出的持续时间:
部分来计算视频中的帧数。h264
好的,我移动到笔记本电脑上,使用全长胶片作为输入运行相同的命令。我看到了一种效果,当我一秒一秒地增加搜索点时,输出图像不会像你预期的那样在镜头中向前移动。相反,输出在几秒钟内保持不变,然后跳转到完全不同的图片。这就好像-ss seek没有跳转到精确点的能力,而必须在关键帧或其他什么之间跳转。可能您已经成为“快速”与“精确”搜索的牺牲品,但我已经阅读了该页,并且我理解快速搜索(-ss before-I)现在是帧精确的(我理解这一点,因为我在那页以及其他几页上读到了它)-虽然如果这不是真的,那肯定可以解释这种行为。也许这是FFmpeg中的一个补丁,但不是avconv?FFmpeg可以准确地查找ss
用作输入选项的时间-请参阅-ss
。这已经是一段时间的事实。