実現したいこと
外部サーバーにあるhls動画をffmpegを通じてリアルタイムで再生する際に、再生時間の初期シークがしたい。(60秒地点から再生、など)
発生している問題・分からないこと
-ss {n}
オプションを用いると、以下のような挙動になる。
- n ≦ 6の場合
- 動画のn秒地点から再生される(期待している動作)
- n > 6の場合
- 動画が再生されない
- `Output file is empty, nothing was encoded(check -ss / -t / -frames parameters if used)‘というログが出る
6秒以下と7秒以上に壁があるのは、おそらくm3u8ファイルの1セグメントが6秒台だからだと考えています。
なので、シークする際に1つ目のセグメント内のみを参照しており、2つ目以降のセグメントは無視されているということかと思います。
該当のソースコード
ffmpeg -re -ss 60 -headers 'Cookie: hogehoge;' -i '~.m3u8' out.mp4
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
-live_start_index {n}
の設定- m3u8ファイルのURLの頭に
hls+
を付ける- 結果:403エラー
- httpsプロトコルの際にCookieを渡すことで403エラーを回避しているが、hlsにしたことでそれが上手く渡せていない?
- cf. https://video.stackexchange.com/questions/33178/seeking-in-large-hls-input-on-ffmepg
補足
ffmpeg -version: 7.0-essentials_build-www.gyan.dev
FFmpeg/libavformat/hls.c at master · FFmpeg/FFmpeg
https://github.com/FFmpeg/FFmpeg/blob/master/libavformat/hls.c#L2584C7-L2584C7
-http_seekable というオプションがあって、これを有効にする(-http_seekable 1)とよいかもしれません。
melianさん
コメントありがとうございます。`-http_seekable`を付けて色々と試してみましたが、指定しない場合と同様の挙動でした。
そういえばまだffmpegのソースコードを追っていなかったので、そちらも少し見てみようかと思います。
あなたの回答
tips
プレビュー