web-dev-qa-db-ja.com

「ffmpeg-ss」は正確なシークのためのフォーマットをサポートしていますか? mp3は機能していないようで、.wavのみが機能しているようです。

ffmpeg -ss 00:00:00 -i'input.mp3 '-to 00:25:00 -c copy output.mp3

スクリプトを作成しているときに、この特定のスクリプトがmp3ファイルでは機能するが、.wavファイルでは機能しないことに気付きました。何が起こるかというと、それは(奇妙なことに)25分の.mp3ファイルにコピーしますが、本質的に最後にオーディオをクリップします。何らかの理由で実際のオーディオが25分の境界を超えて伸びているようで、クリッピングが発生します。ただし、これは.wavファイルでは発生しません。以下のmanページを検索すると、次のようになります。

-ss位置(入力/出力)入力オプション(-iの前)として使用される場合、この入力ファイルで位置をシークします。 ほとんどのフォーマットでは正確にシークすることができないため、ffmpegは位置の前に最も近いシークポイントをシークします。トランスコーディングと-accurate_seekが有効になっている場合(デフォルト)、シーク間のこの余分なセグメントポイントと位置はデコードされて破棄されます。ストリームコピーを実行するとき、または-noaccurate_seekが使用されるとき、それは保持されます。

私の質問は、最初に、.mp3は正確にシークするサポートされている形式ではないようですが、何が起こったのかを考えると.wavファイルはサポートされているようです。これがオーディオをクリップした理由ですか?次に、100%正確な-ss時間を持っているサポートされているフォーマットに関するドキュメントはありますか?それはどのmanページにも見つかりません。ドキュメントが存在するかもしれませんが、存在する場合は、そのセクションにリストされているはずです。これはffmpegの悪いドキュメントであり、更新する必要があります!役に立たない漠然とした情報。

2
Nathan

完全にシーク可能なフォーマットは、非圧縮フォーマットのみです。つまりwavとpcm。すべての圧縮形式は「フレーム」にエンコードされます(これが圧縮の仕組みであるため)。コーデックコピーを使用すると、フレーム全体のみをコピーできます。すべてのコーデックは、フレームごとのサンプルに異なる数を使用します。

1
szatmary