Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Video 使用avconv在设定时间从h264视频中获取单帧_Video_Ffmpeg_Raspberry Pi_Raspbian_Avconv - Fatal编程技术网

Video 使用avconv在设定时间从h264视频中获取单帧

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在指定时间从视频文件中获取单个图像

关于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
以秒为单位传递,而不是使用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
。这已经是一段时间的事实。