web-dev-qa-db-ja.com

複雑なフィルターを使用してffmpegの再エンコードを回避する

後でトリミングしてmp4でエンコードするように連結されるtsファイルのリストがあります。

それはすべて正常に機能しています...しかし、私が今抱えている問題は、ファイルが再エンコードされていることです... tsはすでにh264とmp3であるため、それは私が望むものではありません。mp4にパックするだけで機能します。 OK。実際、これは機能します。

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

しかし、これはそうではありません:

ffmpeg -i videohls-1935m-index.ts -y -filter_complex \
[0:v]trim=0:10,setpts=PTS-STARTPTS[v0]; \
[0:a]atrim=0:10,asetpts=PTS-STARTPTS[a0]; \
[0:v]trim=30:90,setpts=PTS-STARTPTS[v1]; \
[0:a]atrim=30:90,asetpts=PTS-STARTPTS[a1]; \
[0:v]trim=100:200,setpts=PTS-STARTPTS[v2]; \
[0:a]atrim=100:200,asetpts=PTS-STARTPTS[a2]; \
[0:v]trim=250:350,setpts=PTS-STARTPTS[v3]; \
[0:a]atrim=250:350,asetpts=PTS-STARTPTS[a3]; \
[v0][a0][v1][a1][v2][a2][v3][a3]concat=n=4:v=1:a=1[out] \
-map [out] \
-c copy \
videohls-1935m-index.mp4

明らかに、出力は[out]にマップされた仮想出口から来るため、コーデックを「コピー」しません(またはそのようなもの...正直なところ、それがどのように機能するかは正確にはわかりませんが、そのようなものです) 、つまり「コーデック」がないので...コピーできません。

これは私が2つの問題を抱えていることを意味します:

  1. ファイルは小さく、まったく悪くはありませんが...
  2. ファイルは再エンコードされます...そのため、品質も低下します。

ビデオの品質を維持するためにこれを回避するにはどうすればよいですか?

2
AbrahamSustaita

フィルタリングには再エンコードが必要ですが、別のオプションがあります:

1.各セグメントを作成します

代わりにできることは ストリームコピー-ss-tまたは-to-c copyを使用した各セグメントです。

  • 最初の10秒をスキップして、20秒の出力を作成する例:

    ffmpeg -ss 10 -i input -t 20 -c copy output
    
  • 最初の10秒をスキップし、期間30で停止して、20秒の出力を生成する例:

    ffmpeg -i input -ss 10 -to 30 -c copy output
    

2.連結します

  1. まず、 concat demuxerのドキュメント をお読みください。

  2. 次に、リストファイルを作成します。

    $ cat inputs.txt
    file '/path/to/segment00.mp4'
    file '/path/to/segment01.mp4'
    file '/path/to/segment02.mp4'
    file '/path/to/segment03.mp4'
    
  3. 最後に、以下を連結できます。

    ffmpeg -f concat -i inputs.txt -c copy output
    

こちらもご覧ください

2
llogan