web-dev-qa-db-ja.com

Windowsでffmpegを使用してAVC / MPEG-TSビデオファイルをトランスコードせずに分割して結合するにはどうすればよいですか?

Linuxソリューションも探しています( 別の質問 )。

拡張子が_.ts_の録画済みビデオファイルが2つあります。最初のファイルの一部を削除し、2番目のファイルを分割してから、最初のファイルを2番目のファイルの最初の(分割された)部分とマージする必要があります。

それらは両方とも同じ特性を持っています:

_Format                                   : MPEG-TS
File size                                : 3.16 GiB
Duration                                 : 1h 39mn
Overall bit rate mode                    : Variable
Overall bit rate                         : 4 527 Kbps

Video
ID                                       : 720 (0x2D0)
Menu ID                                  : 6181 (0x1825)
Format                                   : AVC
Format/Info                              : Advanced Video Codec
Format profile                           : High@L4
Format settings, CABAC                   : Yes
Format settings, ReFrames                : 4 frames
Codec ID                                 : 27
Duration                                 : 1h 39mn
Width                                    : 1 440 pixels
Height                                   : 1 080 pixels
Display aspect ratio                     : 16:9
Frame rate                               : 25.000 fps
Color space                              : YUV
Chroma subsampling                       : 4:2:0
Bit depth                                : 8 bits
Scan type                                : MBAFF
_

また、複数のオーディオトラックと字幕が含まれています。

ファイルをトランスコードせずにそれらを処理したい、少なくとも最初を削除できるようにしたいなど。

FFMPEG

_ffmpeg -i source.mts_は以下を提供します:

_Input #0, mpegts, from 'source1.mts':
      Duration: 01:40:00.76, start: 2995.511878, bitrate: 4526 kb/s
      Program 6181
        Stream #0:0[0x46](fra,fra): Subtitle: dvb_teletext ([6][0][0][0] / 0x0006)
        Stream #0:1[0x2d0]: Video: h264 (High) ([27][0][0][0] / 0x001B), yuv420p, 1440x1080 [SAR 4:3 DAR 16:9], 25 fps, 25 tbr, 90k tbn, 50 tbc
        Stream #0:2[0x2da](fra): Audio: aac (HE-AAC) ([15][0][0][0] / 0x000F), 48000 Hz, stereo, fltp, 73 kb/s
        Stream #0:3[0x2db](qaa): Audio: aac (HE-AAC) ([15][0][0][0] / 0x000F), 48000 Hz, stereo, fltp, 67 kb/s
        Stream #0:4[0x2dc](deu): Audio: aac (HE-AAC) ([15][0][0][0] / 0x000F), 48000 Hz, stereo, fltp, 49 kb/s
        Stream #0:5[0x2dd](qad): Audio: aac (HE-AAC) ([15][0][0][0] / 0x000F), 48000 Hz, stereo, fltp, 57 kb/s
_

私が見つけたコマンドとして、クロスプラットフォームでもあるffmpegを使用すると、1つのファイルの一部を削除することが非常にうまくいくと思います ここ

_ffmpeg -i InputFile -vcodec copy -acodec copy -ss 00:12:34.567 -t 00:34:56.789 OutputFile
_

入力に4つのオーディオトラックがあり、このようにして最初の(Stream #0:2[0x2da](fra))オーディオのみが取得されるという事実を除いて、機能します。私が欲しいのは、すべてのオーディオ、または3番目の(Stream #0:3[0x2db](qaa))です。調整方法は?

したがって、ffmpegは次のように機能するはずです。

1。最初のファイルの先頭を切り取ります(1時間40分のファイルから最初の2分を削除します)

2。 2番目の(1時間)ファイルを2つの部分に分割します(3.05分後)

3。最初のファイルの最後に、2番目のファイルを分割して得られた3.05分の部分を結合(追加)します。


私が試したこと:

Openshot:トランスコーディングなしでは処理できません。

Avidemux(Linux):保存しようとすると「これはMPEG互換ではありません-コピーコーデックは使用できません。」

WindowsのAvidemux:オーディオが同期していない。

4
user162573

すべてのオーディオトラックを保持しながら、ffmpegを使用してファイルを分割および結合するにはどうすればよいですか?

あなたが発見したように、ビットストリームコピーは ストリーム仕様ドキュメント に従って1つ(オーディオ)トラックのみを選択します:

デフォルトでは、ffmpegは、入力ファイルに存在する各タイプ(ビデオ、オーディオ、字幕)のストリームを1つだけ含み、それらを各出力ファイルに追加します。次の基準に基づいて、それぞれの「最良」を選択します。ビデオの場合は最高の解像度のストリーム、オーディオの場合は最も多くのチャンネルのストリーム、字幕の場合は最初の字幕ストリームです。同じタイプの複数のストリームのレートが等しくなる場合は、インデックスが最も低いストリームが選択されます。

allオーディオトラックを選択するには:

ffmpeg -i InputFile.ts-c copy -ss 00:12:34.567 -t 00:34:56.789 -map 0:v -map 0:a FirstFile.ts

thirdオーディオトラックを選択するには:

ffmpeg -i InputFile.ts -c copy -ss 00:12:34.567 -t 00:34:56.789 -map 0:v -map 0:a:2 FirstFile.ts

ffmpegドキュメントの 高度なオプション セクションで、ストリーム選択の詳細と他の例を確認できます。

また、表現をコンパクトにするために、上記のように、元のコマンドの-vcodec copy -acodec copy-c copyに結合します。

スプリット:

したがって、後で再結合するために分割するという観点から、これらを2つのファイルで達成したいものと組み合わせます。

ffmpeg -i InputOne.ts -ss 00:02:00.0 -c copy -map 0:v -map 0:a OutputOne.ts
ffmpeg -i InputTwo.ts -c copy -t 00:03:05.0 -map 0:v -map 0:a OutputTwo.ts

あなたに与えるでしょう:

  • OutputOne.ts、これがすべてですafter最初の入力ファイルの最初の2分
  • OutputTwo.ts、これはfirst 2番目の入力ファイルの3分5秒です

参加:

ffmpegは、再エンコードせずにファイルの連結をサポートします 連結ドキュメントで詳細に説明されています

結合するファイルのリストを作成します(例:join.txt):

file '/path/to/files/OutputOne.ts'
file '/path/to/files/OutputTwo.ts'

次に、ffmpegコマンドでconcat demuxerを使用できます。

 ffmpeg -f concat -i join.txt -c copy FinalOutput.ts

mpegトランスポートストリーム(.ts)を使用しているので、should連結protocol同様に:

ffmpeg -i "concat:OutputOne.ts|OutputTwo.ts" -c copy -bsf:a aac_adtstoasc output.mp4

上にリンクされたconcatページの例によると。実験するのはあなたに任せます。

4
bertieb

主なものに基づいた簡単な答えとして:

開始点の後(終了まで)にデータを保持するには:

ffmpeg -i INPUT -c copy -ss START_TIME -map 0 OUTPUT

2つの時点の間でデータを保持するには:

ffmpeg -i INPUT -c copy -ss START_TIME -to END_TIME -map 0 OUTPUT

特定のポイントの後で特定の期間のデータを保持するには:

ffmpeg -i INPUT -c copy -ss START_TIME -t DURATION_TIME -map 0 OUTPUT

開始後、一定期間のデータを保持するには:

ffmpeg -i INPUT -c copy -t DURATION_TIME -map 0 OUTPUT

データが開始されないようにするには:

ffmpeg -i INPUT -c copy -to TIME_POINT -map 0 OUTPUT

TIMEは秒数、またはhh:mm:ss [.xxx]の数値です。


ファイルを結合するには、コンテンツを含むjoin.txtというファイルを作成します

file 'path-to-INPUT1'
file 'path-to-INPUT2'
file...etc

その後

 ffmpeg -f concat -i join.txt OUTPUT

または:

Mpegファイル(トランスポートファイルを含む)を結合するには

 ffmpeg -i "concat:INPUT-1|INPUT-2" -c copy -bsf:a aac_adtstoasc OUTPUT

GUIソリューションとして、Avidemuxを試しましたが、結果は良くありません。 Linuxソリューションを検索すると、このコメントが見つかりました ここAvidemux nightlyを指しています:

"Avidemuxを試すことはできますが、安定版を試すことはできません。Win32バージョン(はい、Windowsの場合)は" Wine "で試してください。H.264をサポートしており、二重矢印を使用して見つける必要があります。どこでもカットできないため(「長いゴップ」のせいで...)、キーフレームを削除します。ただし、このようなすべてのソフトウェアと同様に、JUST CUTSを実行できます。そうしないと、レンダリングされます(トランジション、エフェクト、 ectc。). http://avidemux.org/nightly/win32/ "

Linux/Wineでテストしましたが、Windowsでも動作するはずです。

enter image description here

ファイルを結合するには、File-Openを使用して最初のファイルを追加し、次にFile-Appendを使用して残りを追加します。

保存するには:ファイル-保存します。

3
user162573