FFmpeg:如何在自定义框架上应用过滤器并将它们的输出放置在大型机之间
FFmpeg : How to apply a filter on custom frames and place output of them between mainframes
我有一个隔行扫描视频流,需要在自定义视频帧上应用一个过滤器(任何将两帧作为输入的过滤器,例如 tblend 或 lut2)并将它们的输出放在大型机之间,如下所示:
Input frames: [1] [2] [3] ..... FPS=25
| \ / | \ / |
| \ / | \ / |
Output frames: [1] [f(1,2)] [2] [f(2,3)] [3] ..... FPS=50 i/p
我想我需要 select filter + Expressions
到 select 帧,但我不知道该怎么做
请帮忙。
注:
Input has no audio stream.
Output = uncompressed yuv422 8bits in AVI container
the output scan type can be interlaced or progressive
I have to do this with just one command.
我试过FFmpeg -i in.avi -vf tblend -vcodec rawvideo out.avi
,但是这个命令的输出不是我想要的。
您可以链接 tblend
、interleave
和 setpts
过滤器,而交错过滤器的两个输入是 tblend
的输出和原始视频:
示例(假设输入帧率为 25Hz):
ffmpeg -y -i in.avi -filter_complex "[0:v]tblend=all_mode=average[v1],[v1][0:v]interleave,setpts=N/50/TB" -r 50 -vcodec rawvideo -pix_fmt bgr24 out.avi
[0:v]tblend=all_mode=average[v1]
使用 tblend
过滤器创建流,并为输出指定临时名称 [v1]
.
[v1][0:v]interleave
应用 [v1]
和原始视频的 interleave 滤镜。
setpts=N/50/TB
修复了应用 50fps 输出视频的时间戳。
-r 50
将输出帧速率设置为 50Hz。
注意:我选择了-pix_fmt bgr24
,因为yuv422
没有和MPC-HC一起玩。
测试中:
构建合成模式(-r 25
、rate=1
和setpts=N/25/TB
用于创建25Hz的计数:
ffmpeg -y -f lavfi -r 25 -i testsrc=size=192x108:rate=1:duration=10 -vf setpts=N/25/TB -vcodec rawvideo -pix_fmt bgr24 in.avi
执行命令:
ffmpeg -y -i in.avi -filter_complex "[0:v]tblend=all_mode=average[v1],[v1][0:v]interleave,setpts=N/50/TB" -r 50 -vcodec rawvideo -pix_fmt bgr24 out.avi
逐帧检查:
可以看到,第0帧和第2帧是原始帧,第1帧和第3帧是两个原始帧的混合输出。
隔行扫描视频帧的两种情况示例:
tinterlace 滤镜用于创建 合成 交错视频。
模拟源自单个视频帧的两个场:
'drop_even, 1'
Only output odd frames, even frames are dropped, generating a frame with unchanged height at half frame rate.
------> time
Input:
Frame 1 Frame 2 Frame 3 Frame 4
11111 22222 33333 44444
11111 22222 33333 44444
11111 22222 33333 44444
11111 22222 33333 44444
Output:
11111 33333
11111 33333
11111 33333
11111 33333
ffmpeg -y -f lavfi -i testsrc=size=192x108:rate=2:duration=10 -vf tinterlace=drop_even,fieldorder=tff -vcodec rawvideo -pix_fmt bgr24 in_drop_even.avi
模拟在不同时间捕获的两个场(不是源自同一视频帧):
'interleave_top, 4'
Interleave the upper field from odd frames with the lower field from even frames, generating a frame with unchanged height at half frame rate.
------> time
Input:
Frame 1 Frame 2 Frame 3 Frame 4
11111<- 22222 33333<- 44444
11111 22222<- 33333 44444<-
11111<- 22222 33333<- 44444
11111 22222<- 33333 44444<-
Output:
11111 33333
22222 44444
11111 33333
22222 44444
ffmpeg -y -f lavfi -i testsrc=size=192x108:rate=2:duration=10 -vf tinterlace=interleave_top,fieldorder=tff -vcodec rawvideo -pix_fmt bgr24 in_interleave_top.avi
我有一个隔行扫描视频流,需要在自定义视频帧上应用一个过滤器(任何将两帧作为输入的过滤器,例如 tblend 或 lut2)并将它们的输出放在大型机之间,如下所示:
Input frames: [1] [2] [3] ..... FPS=25
| \ / | \ / |
| \ / | \ / |
Output frames: [1] [f(1,2)] [2] [f(2,3)] [3] ..... FPS=50 i/p
我想我需要 select filter + Expressions
到 select 帧,但我不知道该怎么做
请帮忙。
注:
Input has no audio stream.
Output = uncompressed yuv422 8bits in AVI container
the output scan type can be interlaced or progressive
I have to do this with just one command.
我试过FFmpeg -i in.avi -vf tblend -vcodec rawvideo out.avi
,但是这个命令的输出不是我想要的。
您可以链接 tblend
、interleave
和 setpts
过滤器,而交错过滤器的两个输入是 tblend
的输出和原始视频:
示例(假设输入帧率为 25Hz):
ffmpeg -y -i in.avi -filter_complex "[0:v]tblend=all_mode=average[v1],[v1][0:v]interleave,setpts=N/50/TB" -r 50 -vcodec rawvideo -pix_fmt bgr24 out.avi
[0:v]tblend=all_mode=average[v1]
使用tblend
过滤器创建流,并为输出指定临时名称[v1]
.[v1][0:v]interleave
应用[v1]
和原始视频的 interleave 滤镜。setpts=N/50/TB
修复了应用 50fps 输出视频的时间戳。-r 50
将输出帧速率设置为 50Hz。
注意:我选择了-pix_fmt bgr24
,因为yuv422
没有和MPC-HC一起玩。
测试中:
构建合成模式(
-r 25
、rate=1
和setpts=N/25/TB
用于创建25Hz的计数:ffmpeg -y -f lavfi -r 25 -i testsrc=size=192x108:rate=1:duration=10 -vf setpts=N/25/TB -vcodec rawvideo -pix_fmt bgr24 in.avi
执行命令:
ffmpeg -y -i in.avi -filter_complex "[0:v]tblend=all_mode=average[v1],[v1][0:v]interleave,setpts=N/50/TB" -r 50 -vcodec rawvideo -pix_fmt bgr24 out.avi
逐帧检查:
可以看到,第0帧和第2帧是原始帧,第1帧和第3帧是两个原始帧的混合输出。
隔行扫描视频帧的两种情况示例:
tinterlace 滤镜用于创建 合成 交错视频。
模拟源自单个视频帧的两个场:
'drop_even, 1'
Only output odd frames, even frames are dropped, generating a frame with unchanged height at half frame rate.
------> time
Input:
Frame 1 Frame 2 Frame 3 Frame 4
11111 22222 33333 44444
11111 22222 33333 44444
11111 22222 33333 44444
11111 22222 33333 44444
Output:
11111 33333
11111 33333
11111 33333
11111 33333
ffmpeg -y -f lavfi -i testsrc=size=192x108:rate=2:duration=10 -vf tinterlace=drop_even,fieldorder=tff -vcodec rawvideo -pix_fmt bgr24 in_drop_even.avi
模拟在不同时间捕获的两个场(不是源自同一视频帧):
'interleave_top, 4'
Interleave the upper field from odd frames with the lower field from even frames, generating a frame with unchanged height at half frame rate.
------> time
Input:
Frame 1 Frame 2 Frame 3 Frame 4
11111<- 22222 33333<- 44444
11111 22222<- 33333 44444<-
11111<- 22222 33333<- 44444
11111 22222<- 33333 44444<-
Output:
11111 33333
22222 44444
11111 33333
22222 44444
ffmpeg -y -f lavfi -i testsrc=size=192x108:rate=2:duration=10 -vf tinterlace=interleave_top,fieldorder=tff -vcodec rawvideo -pix_fmt bgr24 in_interleave_top.avi