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,但是这个命令的输出不是我想要的。

您可以链接 tblendinterleavesetpts 过滤器,而交错过滤器的两个输入是 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 25rate=1setpts=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