私は、VLC を使用して保存したフル HD IPTV チャンネルからのビデオ録画をいくつか持っています。これらのストリーム ダンプは MPEG-TS ファイルとして保存され、MPEG オーディオを含む AVC エンコード ビデオが含まれています。
これらの録画から、フレーム精度のカットポイントに基づいて特定のクリップを抽出したいのですが、渡す必要がある正確なミリ秒のタイムスタンプを決定するのが困難です。FFMPEG's-ss
と-to
パラメータを使用して、必要なカットポイントを正確にヒットします。これまでに試したことは次のとおりです。
試行 1
最初に試したのは、.ts
ファイルをアビデマックスフレーム単位でのシークが快適に行え、現在のフレームのタイムスタンプを必要な精度で表示します。ただし、シークしたフレームのタイムスタンプを(形式HH:MM:SS.mmm
)に入力すると、FFMPEGパラメータによっては、カットは実際には数フレーム、場合によっては 1 秒以上ずれることがあります。ずれはファイルごとに異なり、正または負になることがあります。
そして、これらの録画のほとんどで、最初のフレームがアビデマックス実際にはゼロではないタイムスタンプ(例えば、00:00:00.280
または00:00:00.216
)が表示されます。VLCすぐに録音が始まりますが、アビデマックス最初の I フレームまでのすべてを無視します。00:00:00.216
しかし、 のようなタイムスタンプについては、まだ疑問に思います。なぜなら、これらのビデオは 25 fps であり、216 は 40 ms の倍数ではないからです。
試行2
私は2パスプロセスを試しました。これは、ビデオを一度エンコードし、希望するカットより少し早めにエンコードを開始し、希望する終了より少し後に終了するというものです。その後、アビデマックス動画の最初と最後の余分なフレームを数えてカットポイントをnFrames * 40 ms
内側に移動する。しかし、結果はまだ正確ではないため、ビデオのフレーム数が少なすぎたり多すぎたりすることがあります。
信頼を失うアビデマックスのタイムスタンプの精度、または少なくともいくつかの計算が他のものと異なると結論付けている。FFMPEG最も安全な方法は、実際にビデオをカットするときに使用するのと同じツールを使用してカットポイントを決定することだと考えました。
試み3
-ss
私はFFMPEGを使って、ビデオをカットするのに使うのと同じパラメータを使い-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 トランスポート ストリームで、ビデオ セグメントを何度もデコード、カット、保存して、少しずつ手動で目的のコンテンツに近づける必要はありませんか?
こちらはメディア情報ストリーム自体に何か奇妙な点があるという手がかりが含まれている場合に備えて、録音の 1 つに次の内容を含めます。
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
追加情報:タイムスタンプのドリフトはファイルごとに異なりますが、各ファイル内では一定です。つまり、ビデオで複数のカットを行う必要があり、1つのカットで抽出された画像に与えられたタイムスタンプがFFMPEGは常に に使用する必要のある値より 160 ミリ秒低いので-ss
、同じファイル内の残りのカットに同じオフセットを使用でき、正確になります。