ffmpegは、bashで実行したときにドットを含む出力へのパスを切り捨てます。

ffmpegは、bashで実行したときにドットを含む出力へのパスを切り捨てます。

次のような点があるパスがある場合:

/home/user/Documents/hello/test.testing_23-24.123/test.testing_23-24.124

ffmpegファイルパスを引数として渡すとファイルが見つかりますが、ファイルを出力すると、ファイルパスで最初に見つかった点にパス名が切り捨てられます。

たとえば、次のような結果が得られました。

#!/bin/sh
src_folder=`pwd`

for filename in "${src_folder}"/*.MP4
  do
    ffmpeg -threads 0 -probesize 100M -analyzeduration 100M -i "${filename}" \
      -c:v libx265 -preset medium -pass 1 -tune grain -x265-params "crf=28:pmode=yes" \
      -c:a libmp3lame -q:a 9 -strict experimental "${filename%%.*}"_1stpass.mkv
  done

出力状態:

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/home/user/Documents/hello/test.testing_23-24.123/test.testing_23-24.124/GOPR2103.MP4':

[..]

Output #0, matroska, to '/home/user/Documents/hello/test_hevc.mkv':

出力ファイルのフォルダパスは次のとおりです。

 /home/user/Documents/hello/test.testing_23-24.123/test.testing_23-24.124

ffmpeg出力パスの最初のポイントに出会い、切り捨てます。これは出力ファイル名にのみ発生します。また、切り捨てられたパスをファイル名として使用します。

誰もがこの問題を解決する方法の正しい方向を教えてもらえますか?

PS:ドット付きのフォルダを使用しないことが悪い解決策であることを知っています。]

答え1

〜のようにジアン コメントとして指摘する、(意図せずに)最初のドット/ピリオドが見つかるまで、ファイルパスの末尾からできるだけ多くの文字を削除するようにシェルに指示し%%ます.*。 「拡張子」(例MP4:)のファイル名を削除したい場合があります。この場合は単一を使用する必要があります%。これは次のとおりです。最短文字数。

MP4ファイルを選択することを知っているので、拡張をさらに簡素化し、%その4文字を削除するように直接要求できます。

pwdまた、現在のディレクトリからファイル名を収集する必要がある場合は、拡張する必要はほとんどありません。

次のようなものを使用してください。

for filename in ./*.MP4
  do
    ffmpeg -threads 0 -probesize 100M -analyzeduration 100M \
      -i "${filename}" \
      -c:v libx265 -preset medium -pass 1 -tune grain -x265-params \
      "crf=28:pmode=yes" -c:a libmp3lame -q:a 9 -strict experimental \
      "${filename%.MP4}"_1stpass.mkv
  done

関連情報