

タイトル通りの質問なんですが、ffmpegのコマンドで、

> ffmpeg -i test.mp4 -threads 2 -codec:v libx264 -s:v 1280x720 -aspect:v 16:9
> -b:v 256k -re -fpre:v libx264-hls.ffpreset -codec:a libfaac -ar:a 44100 -b:a
> 128k -ac:a 2 -map 0 -f segment -segment_format mpegts -segment_time 10
> -segment_list stream.m3u8 streamfiles/stream%03d.ts

というコマンドがあってこれのオプションの意味とかを調べてみたんですが、いくつかわからなかったことと、実行した際にエラーが起きたので解決策を教えて欲しいです。

まずオプションについてなんですが、`-re`と`-fpre`がどうしてもわからなかったので教えて欲しいです。また、ffmpegのオプションで`codec`や`vcodec`はあっても`codec:v`はありませんでしたが、なぜこれなのかも教えて欲しいです。

次にエラーなんですがこれを実行してみると、

> Option re (read input at native frame rate) cannot be applied to output file
> streamfiles/stream%03d.ts

とでて、出力ファイル、またはその逆に入力オプションを適用しようとしているとでますが、意味が分からなくて、、、  
使い方が間違っているのでしょうか？  
実行する時はtest.mp4が置いてある、streamfilesのディレクトリでやってます。


CC BY-SA 3.0
2015-09-17T07:49:18.550
16703
2015-09-18T03:03:56.097
2015-09-18T03:03:56.097
49
9349
question
ffmpeg
ffmpegのコマンド-re/-fpre/-codec:vについて教えてください。


-re オプションを付けると、入力データのフレームレートで読み込みます。（入力と出力でフレームレートを同期します）  
-fpre オプションを付けると、外部のプリセット（設定）ファイルを読み込むことが出来ます。  
-codec:v は、ビデオコーデックを指定できます。-vcodecと似たような物と考えて良いです。

エラーの原因について、プリセットファイルの中身がわからないため推測ですが、  
-re を付けている場合、固定フレームレートでの変換になるのですが、  
プリセットファイル内で品質固定（-crfオプション等）してしまっているのでは無いでしょうか？  
h264等の品質固定モードの場合、フレームレートは可変になるため固定することが出来ません。  
-re を一旦外して試してみてください。


CC BY-SA 3.0
2015-09-17T09:19:20.710
16706
2015-09-17T09:19:20.710
732
16703
answer


各種オプションの動作については、[FFmpeg公式ドキュメント](https://www.ffmpeg.org/ffmpeg.html)を参照してください。

> 5.5 Video Options  
>  `-vcodec codec` (output)  
>  Set the video codec. This is an alias for `-codec:v`.

映像コーデックの指定は`-codec:v`が本来のオプション名です。`-vcodec`がエイリアス（別名）です。

> 5.11 Advanced options  
>  `-re` (input)  
>  Read input at native frame rate. Mainly used to simulate a grab device. or
> live input stream (e.g. when reading from a file). Should not be used with
> actual grab devices or live input streams (where it can cause packet loss).
> By default `ffmpeg` attempts to read the input(s) as fast as possible. This
> option will slow down the reading of the input(s) to the native frame rate
> of the input(s). It is useful for real-time output (e.g. live streaming).

`-re`オプションは「本来の(native)フレームレート速度でファイルを読み込む」よう指示します。

ファイル入力ではカメラ等のライブソースと異なり、エンコード処理が十分高速ならばリアルタイムよりも速くデータを生成できます。例えば30fps素材の場合でも、秒間60frameを処理できるなら、最終的にコンテンツ尺比の1/2の時間で処理できます。これはファイル-
to-
ファイル変換の時は処理時間を短縮できて望ましい挙動ですが、ストリーミング出力ではx2早送り再生になってしまうという問題が生じます。本オプションはこの動作を回避するために存在します。

> 5.12.1 ffpreset files  
>  ffpreset files are specified with the `vpre`, `apre`, `spre`, and `fpre`
> options. The `fpre` option takes the filename of the preset instead of a
> preset name as input and can be used for any kind of codec. [...]

`-fpre`オプションには、コーデックパラメータ設定が記述された「プリセットファイル」を指定します。

* * *

> 次にエラーなんですがこれを実行してみると、Option re (read input at native frame rate) cannot be
> applied to output file streamfiles/stream%03d.ts

これは推測に過ぎませんが、「HLS(HTTP Live Streaming)では`-re`オプションを付けても無駄だから」と考えます。

HLSによる動画像配信では、サーバからクライアントへデータをPUSH配送するのではなく、クライアントからサーバにデータを取りに来るPULL型配送を行います。つまり、HLSコンテンツのエンコード処理速度を、本来のフレームレート相当に抑える必然性はありません。（早く処理できるなら、エンコードしてしまえばよい）


CC BY-SA 3.0
2015-09-18T02:57:16.817
16733
2015-09-18T02:57:16.817
49
16703
answer