2017-08-19 35 views
1

私はH265 4K MP4 29.97fpsのビデオとGOPサイズのちょうど30フレームを持っています。 Iは使用開始から切断しようとすると:ffmpegがH265 vcopyでキーフレームを不正確に探している

ffmpeg -ss 1 -i INPUT.MP4 -vcodec copy OUTPUT_1SEC.MP4 
ffmpeg -ss 2 -i INPUT.MP4 -vcodec copy OUTPUT_2SEC.MP4 
ffmpeg -ss 3 -i INPUT.MP4 -vcodec copy OUTPUT_3SEC.MP4 
ffmpeg -ss 4 -i INPUT.MP4 -vcodec copy OUTPUT_4SEC.MP4 
ffmpeg -ss 5 -i INPUT.MP4 -vcodec copy OUTPUT_5SEC.MP4 
ffmpeg -ss 6 -i INPUT.MP4 -vcodec copy OUTPUT_6SEC.MP4 
ffmpeg -ss 7 -i INPUT.MP4 -vcodec copy OUTPUT_7SEC.MP4 
ffmpeg -ss 8 -i INPUT.MP4 -vcodec copy OUTPUT_8SEC.MP4 
ffmpeg -ss 9 -i INPUT.MP4 -vcodec copy OUTPUT_9SEC.MP4 

出力ビデオ0(-ss 1〜4)、4(-ss 5〜8)または8秒(-ss 9)のいずれかで開始するように以下に示す:

Premiere Pro Timeline

だから、ffmpegのは何とか4秒の代わりに、1秒のGOPを検出するようです。それは普通ですか?

出力ビデオに正しいタイムコードを書き込むにはどうしたらいいですか? は例えば、私のような多くの組み合わせを試みた:

ffmpeg -ss 5 -i INPUT.MP4 -vcodec copy -timecode 00:00:05:00 OUTPUT_5SEC.MP4 
ffmpeg -ss 5 -i INPUT.MP4 -vcodec copy -copyts OUTPUT_5SEC.MP4 
ffmpeg -start_at_zero -ss 5 -i INPUT.MP4 -vcodec copy -copyts OUTPUT_5SEC.MP4 

をしかし、それは私が(最初の行)を置くまたはゼロ(2最後の行)で始まり、正確なタイムコードを与えるのいずれか

をもともと、私が考えていました正確な秒(または数フレーム後)を探しているので、キーフレームを取得することがわかったので、出力が開始される正確なタイムコードを推測することができましたが、ffmpeg -ssはキーフレームに正確に基づいていないようです。多分私はここに何かを見逃しているのだろうか助けてくれてありがとう。

Additionnalに関する情報

私は、この4秒「キーフレーム間隔は」どこから来たかを知りたい理由です、スクリプトカットプロセスをしたいと思います。ここで

は私の入力のffprobe出力である:ここで

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'INPUT.MP4': 
    Metadata: 
    major_brand  : isom 
    minor_version : 512 
    compatible_brands: isomiso2mp41 
    encoder   : Lavf57.72.101 
    comment   : DE=None, Mode=M, DSW=0001 
    location-{ : +XX.4914-0XX.5164+XX.000000/ 
    location  : +XX.4914-0XX.5164+XX.000000/ 
    Duration: 00:01:45.31, start: 0.000000, bitrate: 100065 kb/s 
    Stream #0:0(eng): Video: hevc (Main) (hev1/0x31766568), yuv420p(tv, bt709), 4096x2160 [SAR 1:1 DAR 256:135], 100062 kb/s, 29.97 fps, 29.97 tbr, 30k tbn, 29.97 tbc (default) 
    Metadata: 
     handler_name : VideoHandler 
    Stream #0:1(eng): Subtitle: mov_text (tx3g/0x67337874), 2 kb/s (default) 
    Metadata: 
     handler_name : SubtitleHandler 

は、私はGOPサイズを確認するために使用されるコマンドは( 'I' は、1,31,61で入力し...と 'P' であります)との間で:

ffprobe -i INPUT.MP4 -select_streams v -show_frames -show_entries frame=pict_type -of csv > OUTPUT.CSV 

ffmpegのバージョンN-86330-gbd1179eとffmpegのバージョンN-86330-gbd1179e

編集:キーフレームは、MOOVボックスに、各第二あるがSample video here

+0

「ffprobe -i INPUT.MP4 -select_streamsの出力は何ですか?-show_entriesフレーム= key_frame-of csv> OUTPUT.CSV' – Mulvya

+0

'frame、I''は行1,31,61、...および' frame 、P '他のすべての行に – dsagilles

+0

key_frame値はpict_typeではありません。すべてのIフレームがIDRフレームであるとは限りません。 – Mulvya

答えて

1

、3つだけのフレームが同期サンプルとして設定されている

/moov/trak/mdia/minf/stbl/stss        @ 0x77e8515 
    Box size: 0x1c version: 0x0 flags: 0x0 
    entry_count:    0x3 
    sample_number: 
    0x1 0x79 0xf1 

(それらは、第1、第121回及び241フレームである。)

FFmpegはシーク時にこの情報に依存します。


回避策は、TSにマルチプレックスしてMP4にリムーバブルすることです。

ffmpeg -i input.mp4 -c copy input.ts 

、その後

ffmpeg -i input.ts -c copy newinput.mp4 

または1つのコマンドで

ffmpeg -i input.mp4 -c copy -f mpegts - | ffmpeg -f mpegts -i - -c copy newinput.mp4 
あなたは抽出のためにそのファイルを使用する場合は、指定したので

MPEG-TSファイルは、インデックスを持っていません切り取るキーフレームの前にのキーフレームを探します。

同期テーブルがそのような理由についてはわかりません。これは、オリジナルのアプリケーションとそこで使用されている設定/引数までです。

+0

これらの有用な情報をありがとう。毎秒newinput.mp4を分割することができますが、結果のクリップにはジャンプ、黒と緑のフレーム+圧縮ブロックが含まれています。私はすべての私のh265をDnxHRに変換してしまいました。そして私は完全な未編集のh265をアーカイブのままにしています。私はあなたがこれを調査するために取った時間を本当に感謝しています。今、私はキーフレームのことについてもっと理解しています。 – dsagilles

関連する問題