0

最近のほとんどのMatroskaビデオファイル(.mkv)では、ヘッダー圧縮が有効になっています。これによりハードウェアプレーヤーとの互換性が失われるため、ヘッダー圧縮を使用せずにmkvtoolnixを使用してファイルを再アセンブルすることにより、ずっと前にバッチを「修正」しました。しかし、奇妙なことに、ソースが正しい場合でも、バッチが一部の.mkvで機能しません。しゃっくりにはパターンがありません...

そのため、私は今日、小さなPython 3.2スクリプトを書き始めました。その唯一の目的は、CWD内の.mkvファイルを反復処理し、それらをパラメーターとして使用して、パラメーターを使用してmkvtoolnix-.exeを呼び出すことです。準備したコマンドでos.popen()とos.system()の両方を使用してみましたが、system()はコマンドを誤って解釈しているように見えますが、エスケープしても、popenは少なくとも少し。

そして、それがここでの私の問題です。ここでスクリプトを実行すると、フォルダー内のすべての.mkvファイルに対して.mkv_fix-fileが作成されます。これは問題ありませんが、サイズは元のファイルのごく一部であり、再生できません。私には、popenが.exeを正常に呼び出しているように見えますが、その後ほぼ瞬時に終了し、未完成のファイルのみが残ります。

ここからmkvtoolnixWindows実行可能ファイルを7zipアーカイブとして取得し、スクリプトのCWDのサブディレクトリに配置しました。

また、実行可能ファイルは、バッチから呼び出されたときにコンソール出力を生成することにも注意する必要があります。これは、.py-scriptの場合とは異なります。

コードの重要な部分:

for file in glob.iglob('*.mkv'):
    if file.count('_fix') == 0:
        print(file)
        convertCMD = '"{0}\mkvtoolnix\mkvmerge.exe" -o "{1}_fix" --engage keep_bitstream_ar_info -A -S --compression -1:none "{1}" -D -S --compression -1:none "{1}" -A -D "{1}"'.format(os.getcwd(),file)
        os.popen(convertCMD)
        print('Converted '+file)

どんな種類の助けもありがたいです。

追加情報:

通常のmkvtoolnix出力:

mkvmerge v5.5.0 ('Healer') built on Apr  6 2012 21:43:24
'F:\$PRECONVERT\MKVFILENAME': Using the demultiplexer for the format 'Matroska'.
'F:\$PRECONVERT\MKVFILENAME': Using the demultiplexer for the format 'Matroska'.
'F:\$PRECONVERT\MKVFILENAME': Using the demultiplexer for the format 'Matroska'.
'F:\$PRECONVERT\MKVFILENAME' track 0: Using the output module for the format 'MPEG-4'.
'F:\$PRECONVERT\MKVFILENAME' track 1: Using the output module for the format 'Vorbis'.
'F:\$PRECONVERT\MKVFILENAME' track 2: Using the output module for the format 'Vorbis'.
'F:\$PRECONVERT\MKVFILENAME' track 3: Using the output module for the format 'text subtitles'.
'F:\$PRECONVERT\MKVFILENAME' track 4: Using the output module for the format 'text subtitles'.
The file 'F:\$PRECONVERT\MKVFILENAME.mkv_fix' has been opened for writing.
Progress: 0%
Progress: 16%
Progress: 39%
Progress: 56%
Progress: 78%
Progress: 96%
Progress: 100%
The cue entries (the index) are being written...
Muxing took 3 seconds.
4

2 に答える 2

3

os.popenは非推奨であり、少なくともここ数年は使用していないので、詳細を覚えていません。ただし、ドキュメントには、サブプロセスが終了するのを待つためにos.wait()を呼び出す必要があることが示されています。

subprocess.Popenの場合、そのオブジェクトに対してwait()を呼び出して、オブジェクトが終了したかどうかを確認する必要があります。次の出力を開始する前にこれを行うと、出力が混合されません。一方、一度にすべてを開始する場合は、任意の数のプロセッサコアを使用できるので便利です。出力が混在しないようにするには、目的のために開いたファイルを指すstdout引数を指定してPopen()を呼び出し、サブプロセスごとに1つの出力を作成する必要があります。そうすれば、変換ごとに1つのログファイルを取得できます。これは理にかなっています。

于 2012-04-22T05:08:05.320 に答える
1

.srt字幕をmkvファイルに多重化するために日常的に使用するスクリプトを作成しました。
これは関連するコードです:

import subprocess

mkvmerge_args = [
    mkvmerge_path,
    '-o',
    dest_file_path,
    original_file,
    #other arguments...
    ]

returncode = subprocess.call(mkvmerge_args)

(私のUbuntu Serverマシンで完全に動作し、Windowsでも動作するはずです)

于 2012-04-22T15:14:02.753 に答える