Wie übergebe ich einen Dateinamen mit einem einfachen Anführungszeichen korrekt an den Untertitelfilter von ffmpeg in PyPython

Python-Programme
Anonymous
 Wie übergebe ich einen Dateinamen mit einem einfachen Anführungszeichen korrekt an den Untertitelfilter von ffmpeg in Py

Post by Anonymous »

Ich schreibe ein Python-Skript mit einem Unterprozess, um Untertitel in ein Video fest zu kodieren. Mein Code erstellt ein komplexes Filterdiagramm für das Argument -vf von ffmpeg, das das Einbrennen mehrerer Ebenen gestalteter Untertitel aus einer SRT-Datei umfasst.
Das Skript funktioniert für die meisten Dateien einwandfrei, schlägt jedoch immer dann fehl, wenn der Name der Untertiteldatei ein einfaches Anführungszeichen (Apostroph) enthält, z. B. That's It und That's All.srt.
Wenn das Skript auf eine solche Datei trifft, wird die Der ffmpeg-Prozess schlägt sofort fehl und erstellt keine Ausgabedatei. Dies verursacht einen nachgeschalteten KeyError: 'streams' in meinem Code, wenn er später versucht, ffprobe für die nicht vorhandene Ausgabedatei auszuführen, aber die Hauptursache ist, dass der Befehl ffmpeg stillschweigend fehlschlägt.
Die einzige Lösung, die ich gefunden habe, besteht darin, die Datei programmgesteuert umzubenennen, um das Apostroph zu entfernen, was ich vermeiden möchte.
Als ich das erste Mal darauf stieß, habe ich es durchgelesen Ich habe das Ausgabeprotokoll durchgesehen und festgestellt, dass ffmpeg die Apostrophe selbst aus dem Zeichenfolgenpfad entfernt hat, der im Code an ffmpeg übergeben wurde.

Code: Select all

[Parsed_subtitles_1 @ 000002c435dce5c0] Unable to open C:/FUBAR/Season 01/FUBAR - S01E08 - Thats It and Thats All.srt
Der Code
Hier ist ein vereinfachtes Beispiel dafür, wie die Filterzeichenfolge -vf und der letzte ffmpeg-Befehl in meinem Skript erstellt werden:

Code: Select all

import subprocess
from pathlib import Path

# --- Example of a problematic file path ---
source_video_path = Path(r"C:\videos\FUBAR - S01E08 - That's It and That's All.mkv")
subtitle_path = source_video_path.with_suffix('.srt')

# --- This is how I build the filter string ---
video_filter = 'crop=1920:800:0:140' # Example starting filter

# The subtitle path is formatted for the filter string
# NOTE: My real code finds this path dynamically.
formatted_subtitle_path = str(subtitle_path).replace('\\', '/')

# A simplified version of my style loop
style_string = "FontName=Segoe UI,FontSize=18,PrimaryColour=&H00FFFFFF"

# The filename is placed inside single quotes in the filter
video_filter += f",subtitles=filename='{formatted_subtitle_path}':force_style='{style_string}'"

# --- The final ffmpeg command list ---
command = [
'ffmpeg.exe',
'-y',
'-i', str(source_video_path),
'-vf', video_filter,
'-c:a', 'copy',
'output.mkv',
]

print("--- Generated FFmpeg Command ---")
# Using print to show how Python sees the arguments before execution
for i, arg in enumerate(command):
print(f"Arg[{i}]: {arg}")

# When run, ffmpeg fails on this command because of the ' in the filename.
# process = subprocess.run(command, text=True, capture_output=True)
# print("\n--- FFmpeg Output ---")
# print(process.stderr)
Was ich versucht habe
Ich verstehe, dass das Problem darin besteht, dass das einfache Anführungszeichen in That's It die Zeichenfolge filename='...' im Filter -vf vorzeitig beendet. Ich habe mehrere gängige Methoden ausprobiert, um es zu maskieren, aber keine hat funktioniert:
  • Backslash-Escaping: Ich habe versucht, das Apostroph im formatted_subtitle_path durch verschiedene Escape-Sequenzen zu ersetzen, bevor ich die Filterzeichenfolge erstellt habe.
  • Shell-Zitat-Trick: Ich habe auch die '''-Methode ausprobiert.

    Code: Select all

    replace("'", r"'\''")
  • Verwenden von doppelten Anführungszeichen: Ich habe versucht, die Filterzeichenfolge zu ändern, um den Dateinamen in doppelte Anführungszeichen zu setzen, aber ffmpeg scheint immer noch fehlzuschlagen.

Code: Select all

video_filter += f""",subtitles=filename="{formatted_subtitle_path}":force_style=...
Keiner dieser Versuche war erfolgreich; Der ffmpeg-Prozess startet immer nicht oder es tritt sofort ein Fehler auf.
Was ist die endgültige, plattformübergreifende Möglichkeit, den Dateinamen für den Untertitel-Filter von ffmpeg zu formatieren, damit er Pfade mit einfachen Anführungszeichen korrekt verarbeiten kann?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post