Почему моя команда ffmpeg не работает в подпроцессе Python?

Я хочу объединить два фильма с помощью ffmpeg. В оболочке я могу выполнить это: \\programs\2d\ffmpeg\inst\ffmpeg.bat -y -i "concat:C:/daten/movieA.ts1|C:/daten/movieB.ts2" -c copy -bsf:a aac_adtstoasc C:/daten/movieConcat.mov и все работает нормально. Если я попытаюсь вызвать его из подпроцесса Python:

import subprocess
cmd = [r"\\programs\2d\ffmpeg\inst\ffmpeg.bat", "-i", '"concat:C:/daten/movieA.ts1|C:/daten/movieB.ts2"', "-c", "copy", "-bsf:a aac_adtstoasc", "C:/daten/movieConcat.mov"]
result = subprocess.run(cmd, shell=True, capture_output=True, text=True)
if result.returncode > 0:
    print("create concat failed")
print(result.stdout)
print(result.stderr)

Я получаю эту ошибку:

Trailing option(s) found in the command: may be ignored.
[in#0 @ 00000222c056a1c0] Error opening input: Invalid argument
Error opening input file "concat:C:/daten/movieA.ts1|C:/daten/movieB.ts2".
Error opening input files: Invalid argument

Я понятия не имею, что не так с моим звонком, и буду признателен за любые подсказки.

Я думаю, это может быть связано с тем, что вы используете оператор канала "|" в командной строке

Naitzirch 23.03.2024 17:34

Я почти уверен, что лишние кавычки вокруг "concat:C:/daten/movieA.ts1|C:/daten/movieB.ts2" — ваша ошибка, но Windows просто сумасшедшая, так что, возможно, есть еще кое-что.

tripleee 23.03.2024 20:09

Замыкающая опция msg выглядит так, что "-bsf:a aac_adtstoasc" передается как один токен. Ошибка открытия ввода выглядит неадекватным экранированием во входных URL-адресах — избегайте двоеточия и, возможно, канала.

Gyan 24.03.2024 05:19

Если я удалю кавычки, то получу ошибку: C: is not recognized as internal or external command..

haggi krey 24.03.2024 15:07
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
4
84
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В Windows, если args — это последовательность, она будет преобразована в строку в способ, описанный в Преобразование последовательности аргументов в строку на Окна . Это связано с тем, что базовый метод CreateProcess() работает с струны.

откуда: https://docs.python.org/3/library/subprocess.html

Вы можете попробовать передать cmd как одну строку с помощью '&&' между строковыми командами.

import subprocess
    
cmd = r'\\programs\2d\ffmpeg\inst\ffmpeg.bat -y -i "concat:C:/daten/movieA.ts1|C:/daten/movieB.ts2" && -c copy -bsf:a aac_adtstoasc C:/daten/movieConcat.mov'
    
   
result = subprocess.run(cmd, shell=True, capture_output=True, text=True)
if result.returncode > 0:
    print("create concat failed")
print(result.stdout)
print(result.stderr)

Другие вопросы по теме