ストリーム すべてのストリームをコピー

ストリーム すべてのストリームをコピー

すべての字幕をそのまま維持しながらスペースを節約するために、ffmpegを使用してMatroskaファイルのビデオストリームを再エンコードしようとしています。正確なストリーム番号を指定せずに機能する一般的なコマンドを作成したいと思います。 ffmpegで基本ビデオストリームと基本オーディオストリームを選択してから、すべての字幕を選択する方法がわかりません。

現在使用中の入力ファイルにはこれらのストリームがありますが、他のファイルには異なるストリームがあります。

    [lavf] stream 0: video (mpeg2video), -vid 0
    [lavf] stream 1: audio (ac3), -aid 0, -alang eng, Surround 5.1
    [lavf] stream 2: audio (ac3), -aid 1, -alang fre, Surround 5.1
    [lavf] stream 3: audio (ac3), -aid 2, -alang ita, Surround 5.1
    [lavf] stream 4: audio (ac3), -aid 3, -alang spa, Surround 5.1
    [lavf] stream 5: audio (ac3), -aid 4, -alang eng, Stereo
    [lavf] stream 6: subtitle (dvdsub), -sid 0, -slang eng
    [lavf] stream 7: subtitle (dvdsub), -sid 1, -slang fre
    [lavf] stream 8: subtitle (dvdsub), -sid 2, -slang ita
    [lavf] stream 9: subtitle (dvdsub), -sid 3, -slang spa
    [lavf] stream 10: subtitle (dvdsub), -sid 4, -slang ara
    [lavf] stream 11: subtitle (dvdsub), -sid 5, -slang dan
    [lavf] stream 12: subtitle (dvdsub), -sid 6, -slang dut
    [lavf] stream 13: subtitle (dvdsub), -sid 7, -slang fin
    [lavf] stream 14: subtitle (dvdsub), -sid 8, -slang ice
    [lavf] stream 15: subtitle (dvdsub), -sid 9, -slang nor
    [lavf] stream 16: subtitle (dvdsub), -sid 10, -slang por
    [lavf] stream 17: subtitle (dvdsub), -sid 11, -slang swe
    [lavf] stream 18: subtitle (dvdsub), -sid 12, -slang fre
    [lavf] stream 19: subtitle (dvdsub), -sid 13, -slang ita
    [lavf] stream 20: subtitle (dvdsub), -sid 14, -slang spa

私が試したコマンド:

ffmpeg -i IN.mkv -c:v libx264 -threads 4 -speed 1 -f matroska OUT.mkv

結果:ビデオストリーム1つ、オーディオストリーム1つ、字幕ストリーミングなし

ffmpeg -i IN.mkv -c:v libx264 -threads 4 -speed 1 -f matroska -c:s copy OUT.mkv

結果:ビデオストリーム1つ、オーディオストリーム1つ、字幕ストリーム

ffmpeg -i IN.mkv -c:v libx264 -threads 4 -speed 1 -f matroska -map 0 OUT.mkv

結果:すべての動画すべてのオーディオ、すべての字幕。

ffmpeg -i IN.mkv -c:v libx264 -threads 4 -speed 1 -f matroska -c:s copy -map 0:s OUT.mkv

結果:映像なし音声なし、すべての字幕。

マニュアルが示すように、-c:s copy基本ストリームだけでなくすべてのストリームをコピーする必要がありますが、そうではありません。たぶんこれはバグですか?

明確にするために私が追求した結果は次のとおりです。イプアイデア、一つオーディオとみんなサブタイトル。

答え1

これストリームの選択 デフォルトの動作は、各ストリームタイプに対して1つのストリームのみを選択します。したがって、複数のオーディオストリームを持つ入力は、1つのオーディオストリームで出力を生成します。この動作を無効にして目的のストリームを手動で選択するには、次のようにします。-mapオプション

この例-c copyストリームのコピー(再多重化)入力から出力へ。録音は発生しません。

ストリーム すべてのストリームをコピー

ffmpeg -i input -map 0 -c copy output

最初のビデオストリーム、2番目のオーディオストリーム、すべての字幕

ffmpeg -i input -map 0:v:0 -map 0:a:1 -map 0:s -c copy output

3番目のビデオストリーム、すべてのオーディオストリーム、字幕なし

この例では負のマッピング字幕を除外します。

ffmpeg -i input -map 0:v:2 -map 0:a -map -0:s -c copy output

複数の入力からストリームを選択

すべてのビデオは入力0から出て、すべてのオーディオは入力1から出ます。

ffmpeg -i input0 -i input1 -map 0:v -map 1:a -c copy output

答え2

#!/bin/bash
#指定されたディレクトリ内の各MKVファイルから古い形式のビデオトラックを抽出し、それをx265にトランスコードします。
#目的に合わせて拡張可能;-)私はこのスクリプトを1年以上実行してきました。
エコMKV:移行
echo "| 引数なし: 候補ディレクトリツリー検索"
echo "| dir : このディレクトリをスキャンしてください"
echo "| . -c : この候補のビデオトラックを H.265(x265) に変換します。"
echo "|.-c -r: 新しい結果ビデオに変換してリミックス"
echo "\ . -c -r -k:中間ビデオファイルを保持します(デフォルトではありません)"
エコ「」
日付
echoはMKVファイルのすべてのディレクトリを読み、Mpeg-4p2、H264、XVid、DivX、またはH263トラックがあることを確認します。
echoがあればmkvextractで抽出し、ffmpegでH265に変換します。
echo リミックスの場合、ソースファイルの名前は .old.mkv と指定され、新しいファイルはサフィックス .x265.mkv が付いたソースファイル名を保持します。
echo mkvmergeを使用してリミックスすると、新しいビデオトラックは統合されますが、元の古いフォーマットトラックは統合されません。
echo "(参照:ffmpeg bla bla bla -d \! 0 tracknoトラック0が古いビデオフォーマットの場合は-dにスキップされます。)
エコ。
vidxt="mp4"
ビデオコ="libx265"
H264=""
H264="(H.264)|H264|(MPEG-4p10)|"
CRF="25"
VIDRATE="1500k"
#コアが4つなら400%可能です。プロセスを65%に制限します。
CPULIM=240
#SCALE="-vf スケール=1280:720"
#RATE="-r 23.976216"

#ディレクトリが指定されていない場合は、ローカルディレクトリで作業します。
if["$1"==""];
  ディレクトリ="."
  に変換する ""
  ドレモックス=""
  継続=""
その他
  ディレクトリ="$1"
  コンバージョン=$2
  doremux=$3
  預金=$4
フィリピン諸島
#本当に古い形式を削除するには、まずこのスクリプトを実行します。
if [ "$ H264" == " " ];
  echo "H.264ビデオトラックをスキャンしないでください。"
その他
  echo "H.264ビデオトラックを同時にスキャン:"$H264
フィリピン諸島

#このディレクトリとサブディレクトリにあるすべてのMKVファイルをインポートします。
ファイル名を読み取るときに "$DIR" -type f-name '*.mkv'
する
  #どのトラックに字幕が含まれているかを調べる
  #エコチェック:$ filename
  ホーム=0
  
  mkvmerge -i "$filename" |サブ行を読むとき 'video' |
  する
    候補= ` echo $ subline | egrep -o $H264"(avc1)|(XVID)|(DX50)|MPEG-4p2"`
    #echo $filename.$subline
    if ["$candidate" != "" ];
        # Grepビデオ/オーディオトラック番号
        tracknumber = `echo $ subline | egrep -o "[0-9]{1,2}" |egrep -o "[0-9]{1,2}" |head-1`
        #echo " EVAL : " $candidate " trk: " $tracknumber " cand: " $cand

        if [ $cand != 1 ];
        エコ「|」
        echo $filename" : " $subline " : " $tracknumber
        MYDAT=$(ls -l --full-time "${filename}" |gawk -F ' '{ 印刷 $6" "$7 }' | gawk -F. '{ 印刷 $1 }')
        echo " | 元の日付: "$MYDAT
        ホーム=1
        その他
        echo "/--次の曲"
        フィリピン諸島
        エコ「|」 「日付」
        echo " | 候補者: [$candidate]"

        #字幕のデフォルト名を取得します。
        デフォルトのファイル名= ${ファイル名%。*}
        echo " \-- ビデオ: "$subline" ($basefilename)"
        
        if["$doconvert"=="-c"];
        #トラックを.tmpファイルに抽出
        echo " -- $tracknumber:$basefilename.vid.tmp 抽出 (平均2分) "
            `mkvextractトラック "$filename" $tracknumber:"$basefilename.vid.tmp" >>/dev/null 2>&1`
        `chmod g+rw "$basefilename.vid.tmp"`
        #FFMPEG変換の実行
        エコ「--」「日付」
        echo " -- FFMpeg は $vidco を介して $basefilename.vid.tmp を $vidxt に変換します (平均 2 時間)"
# echo ` ffmpeg -i "$basefilename.vid.tmp" $RATE -c:v:0 $vidco -crf $CRF -b:v:0 $VIDRATE $SCALE "$basefilename.$tracknumber.$vidxt"` > /dev/null 2>&1
        `cpulimit -f --limit=$CPULIM -- ffmpeg -i "$basefilename.vid.tmp" $RATE -c:v:0 $vidco -crf $CRF -b:v:0 $VIDRATE $SCALE "$basefilename .$tracknumber.$vidxt" >/dev/null 2>&1`
        if["$keep"==""];
            `rm "$basefilename.vid.tmp" >/dev/null 2>&1`
        フィリピン諸島
        if [ "$doremux" == "-r" ];
            エコ「--」「日付」
            `mv "$filename" "$basefilename".old.mkv >/dev/null 2>&1`
            echo " -- $tracknumber トラックなしで $filename を $vidxt とミックスします (平均 4 分)"
            mkvmerge -o "$basefilename.x265.mkv" -d \!$tracknumber "$basefilename.old.mkv" "$basefilename.$tracknumber.$vidxt" >>/dev/null 2>&1
            if["$keep"==""];
                `rm "$basefilename.$tracknumber.$vidxt" >/dev/null 2>&1`
            フィリピン諸島
            touch --date="$MYDAT" "$basefilename.x265.mkv" >>/dev/null 2>&1
        フィリピン諸島
        フィリピン諸島
    フィリピン諸島
  完璧
完璧

関連情報