FFMPEG에서 AVC MPEG-TS 스트림을 정확하게 찾으려면 어떻게 해야 합니까?

FFMPEG에서 AVC MPEG-TS 스트림을 정확하게 찾으려면 어떻게 해야 합니까?

VLC를 사용하여 저장한 Full HD IPTV 채널의 비디오 녹화물이 여러 개 있습니다. 이러한 스트림 덤프는 MPEG-TS 파일로 저장되며 MPEG 오디오가 포함된 AVC 인코딩 비디오를 포함합니다.

프레임 단위의 정확한 컷포인트를 기반으로 이러한 녹화물에서 특정 클립을 추출하고 싶습니다. 하지만 전달해야 하는 정확한 밀리초 타임스탬프를 결정하는 데 어려움을 겪고 있습니다.FFMPEG-ss와 매개변수를 사용 -to하여 내가 원하는 컷포인트를 정확하게 맞출 수 있습니다. 지금까지 시도한 내용은 다음과 같습니다.

시도 1

나의 초기 시도는 .ts파일을 다음 위치에 로드하는 것이었습니다.Avidemux편안한 프레임별 검색이 가능하고 현재 프레임의 타임스탬프를 필요한 정밀도로 표시하기 때문입니다. 그러나 내가 찾고 있던 프레임의 타임스탬프를 (형식으로 HH:MM:SS.mmm)FFMPEG매개변수를 사용하면 컷이 실제로 여러 프레임, 때로는 1초 이상씩 벗어나게 됩니다. 드리프트는 파일마다 다르며 양수일 수도 있고 음수일 수도 있습니다.

그러다가 나는 대부분의 녹음에서 첫 번째 프레임이Avidemux실제로는 0이 아닌 타임스탬프를 표시합니다(예: 00:00:00.280또는 심지어 00:00:00.216). 나는 그것을 가정했다VLC바로 녹음이 시작되지만Avidemux첫 번째 I-프레임까지 모든 것을 무시합니다. 하지만 여전히 와 같은 타임스탬프가 궁금합니다 00:00:00.216. 왜냐하면 이 비디오는 25fps이고 216은 40ms의 배수도 아니기 때문입니다.

여기에 이미지 설명을 입력하세요

시도 2

저는 제가 원하는 컷보다 조금 일찍 인코딩을 시작하고, 제가 원하는 컷보다 약간 늦게 끝내는 방식으로 영상을 한 번 인코딩하는 2단계 프로세스를 시도했습니다. 나는 다음을 사용할 것이다Avidemux영상의 시작과 끝 부분에 있는 불필요한 프레임 수를 세고, 컷 포인트를 nFrames * 40 ms안쪽으로 이동합니다. 그러나 결과는아직정확하지 않으면 때로는 너무 적은 프레임으로, 때로는 너무 많은 프레임으로 비디오를 단축하게 될 수도 있습니다.

신뢰를 잃다Avidemux의 타임스탬프 정확성, 또는 적어도 일부 계산을 다르게 수행한다고 결론을 내립니다.FFMPEG, 가장 안전한 방법은 제가 실제로 비디오를 자르는 데 사용하는 것과 동일한 도구를 사용하여 컷 포인트를 결정하는 것이라고 생각했습니다.

시도 3

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, 이전이 아닌 입력 매개변수 이후에 사용)을 수행하며 기록에서 위치를 검색하는 데 몇 시간이 걸릴 수 있습니다.

정확한 프레임 컷을 얻는 데 필요한 타임스탬프를 어떻게 찾을 수 있나요?FFMPEGMPEG 전송 스트림에서 수동으로 비디오 세그먼트를 향해 조금씩 나아가기 위해 비디오 세그먼트를 여러 번 디코딩하고 자르고 저장하지 않고도 어떻게 될까요?

여기는미디어정보스트림 자체에 뭔가 이상한 점이 있다는 단서가 포함된 경우 녹음 중 하나에 다음을 수행합니다.

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에 사용해야 하는 것보다 항상 160ms 낮으므로 -ss동일한 파일의 나머지 컷에 대해 동일한 오프셋을 사용할 수 있으며 정확합니다.

관련 정보