如何在 FFMPEG 中准确寻找 AVC MPEG-TS 流?

如何在 FFMPEG 中准确寻找 AVC MPEG-TS 流?

我使用 VLC 存储了多段来自全高清 IPTV 频道的视频录制。这些流转储存储为 MPEG-TS 文件,包含 AVC 编码的视频和 MPEG 音频。

我想根据帧精确的截点从这些录音中提取特定剪辑。但是,我很难确定需要传递给的精确毫秒时间戳FFMPEG-ss和参数来-to精确达到我想要的切点。以下是我到目前为止尝试过的:

尝试 1

我最初的尝试是将.ts文件加载到艾维德姆克斯因为它允许舒适地逐帧搜索,并以必要的精度显示当前帧的时间戳。但是,如果我将我搜索到的帧的时间戳(格式为HH:MM:SS.mmm)放入FFMPEG参数,剪辑实际上会偏离几帧,有时甚至超过一秒。每个文件的偏移量都不同,可以是正的,也可以是负的。

然后我注意到,对于大多数录音,第一帧艾维德姆克斯实际上显示的时间戳不为零(例如00:00:00.280甚至00:00:00.216)。我假设甚高频液晶立即开始录音,但艾维德姆克斯忽略第一个 I 帧之前的所有内容。00:00:00.216不过,我仍然对这样的时间戳感到疑惑,因为这些视频的帧率为 25 fps,而 216 甚至不是 40 毫秒的倍数。

在此处输入图片描述

第二次尝试

我尝试了两次编码过程,即对视频进行一次编码,编码开始时间略早于我想要的剪辑时间,结束时间略晚于我想要的结尾时间。然后我会使用艾维德姆克斯计算视频开头和结尾的多余帧,并将剪切点向内移动nFrames * 40 ms。然而,结果仍然不精确,这会导致我有时将视频缩短得太少帧,有时又缩短太多帧。

失去信任艾维德姆克斯的时间戳准确性,或者至少得出结论,它的一些计算方式与FFMPEG,我认为最安全的方法是使用与实际剪切视频时使用的相同工具来确定剪切点。

第三次尝试

我尝试使用 FFMPEG 提取所需剪切点周围的单帧,方法是使用-ss-to剪切视频相同的参数,但只选择所需剪切点周围的范围,并将帧写入图片文件。我还将使用过滤器刻录每个帧的精确时间戳,由以下函数确定:FFMPEG,直接插入图片中。这样,我就可以读取所需的切割点并将它们用于实际编码。我的命令行看起来是这样的:

ffmpeg.exe -i input.ts -ss 00:00:29.000 -to 00:00:31.000 -vf drawtext=fontfile=roboto.ttf:fontsize=40:text='%{pts\:hms}':[email protected]:x=10:y=10 image%03d.png

然后,我会找到我想要剪切的确切 PNG,查看时间戳,如果它说00:00:30.160,那就是我用于-ss实际剪切的时间戳。

在此处输入图片描述

然而,这仍然不起作用,我的剪切点仍然比提取的 PNG 早或晚几帧。因此更改FFMPEG从视频到图像的输出似乎会影响时间戳的计算方式,因为它们不匹配!


到目前为止,我还没有找到一种方法来避免必须进行冗长的二进制搜索过程来手动接近剪辑所需的精确时间戳,这特别麻烦,因为我只能通过执行“完整解码搜索”来获取我需要的时间戳(即-ss在输入参数之后使用,而不是之前使用)并且可能需要很长时间才能在录音几个小时后寻找到某个位置。

我如何才能找到我需要的时间戳来获得帧精确剪切FFMPEG在 MPEG 传输流中,无需多次解码、剪切和保存视频片段,即可手动向其靠近?

这里是媒体信息在其中一段录音中,以防它包含任何关于溪流本身出现异常的线索:

General
ID                                       : 1 (0x1)
Complete name                            : C:\Users\…\vlc-record-2021-03-09-00h23m11s.ts
Format                                   : MPEG-TS
File size                                : 2.31 GiB
Overall bit rate mode                    : Variable

Video
ID                                       : 256 (0x100)
Menu ID                                  : 1 (0x1)
Format                                   : AVC
Format/Info                              : Advanced Video Codec
Format profile                           : High@L4
Format settings                          : CABAC / 4 Ref Frames
Format settings, CABAC                   : Yes
Format settings, Reference frames        : 4 frames
Codec ID                                 : 27
Width                                    : 1 920 pixels
Height                                   : 1 080 pixels
Display aspect ratio                     : 16:9
Frame rate                               : 25.000 FPS
Standard                                 : Component
Color space                              : YUV
Chroma subsampling                       : 4:2:0
Bit depth                                : 8 bits
Scan type                                : Interlaced
Scan type, store method                  : Separated fields
Scan order                               : Top Field First
Color range                              : Limited
Color primaries                          : BT.709
Transfer characteristics                 : BT.709
Matrix coefficients                      : BT.709

Audio
ID                                       : 257 (0x101)
Menu ID                                  : 1 (0x1)
Format                                   : MPEG Audio
Format version                           : Version 1
Format profile                           : Layer 2
Codec ID                                 : 3
Bit rate mode                            : Constant
Bit rate                                 : 128 kb/s
Channel(s)                               : 2 channels
Sampling rate                            : 48.0 kHz
Compression mode                         : Lossy
Delay relative to video                  : -248 ms

Menu
ID                                       : 4096 (0x1000)
Menu ID                                  : 1 (0x1)
List                                     : 256 (0x100) (AVC) / 257 (0x101) (MPEG Audio)
Service name                             : Service01
Service provider                         : FFmpeg
Service type                             : digital television

附加信息:每个文件的时间戳漂移都不同,但每个文件内的时间戳漂移都是恒定的。也就是说,如果我需要对一个视频进行多次剪辑,并且对于一次剪辑,确定使用提取的图片中给出的时间戳FFMPEG总是比我需要使用的低 160 毫秒-ss,我可以对同一文件中的其余剪辑使用相同的偏移量,而且它会很精确。

相关内容