av_seek_frame() を使用して FLAC ファイルをシークしても、実際には ffmpeg では機能しないことがわかりました。FLAC を生の PCM にデコードすると問題なく動作しますが、av_seek_frame() を呼び出すとすぐに、次の av_read_frame() の呼び出しで -1、つまりファイルの終わりが返されます。
ソースコードを覗いてみると、次の原因がわかりました。FLAC でのシークは、libavformat/utils.c 内の av_seek_frame_generic() 関数で実装されています。この関数が基本的に行うことは、ループ内で av_read_frame() を呼び出し、目的のシーク位置に対してパケットのタイムスタンプをチェックすることです。
FLAC で動作しない理由は、FLAC デコーダーがストリームから 1024 バイトのハードコーディングされたサイズのパケットを常にプルする汎用リーダーを使用するため、FLAC パケットにタイムスタンプが含まれていないためです。
私は最新バージョンのffpmegを使用していませんが、古いバージョンを使用していますが、FLACの再生は問題なく機能するため、最新バージョンに切り替えたくありません。この古いバージョンのffmpegを適応させたため、これは私にとって重要な作業を意味するからです。私の特定のニーズに。そのため、この古いバージョンの ffmpeg (具体的には、2010 年のバージョン 0.6) で FLAC シークを修正する方法を誰かが知っているかどうかを質問したいと思います。
ありがとう!