2015-08-27 16 views
6

Provare a masterizzare sottotitoli in video con ffmpeg tramite Python. Funziona bene nella riga di comando, ma quando si chiama Python sottoprocesso con:ffmpeg in sottoprocesso Python - Impossibile trovare un formato di output adatto per "pipe:"

p = subprocess.Popen('cd ~/Downloads/yt/; ffmpeg -i ./{video} -vf subtitles=./{subtitles} {out}.mp4'.format(video=vid.replace(' ', '\ '), subtitles=subs, out='out.mp4'), shell=True) 

ottengo:

Unable to find a suitable output format for 'pipe:' 

traceback completa:

'ffmpeg version 2.7.2 Copyright (c) 2000-2015 the FFmpeg developers 
    built with Apple LLVM version 6.1.0 (clang-602.0.53) (based on LLVM 3.6.0svn) 
    configuration: --prefix=/usr/local/Cellar/ffmpeg/2.7.2_1 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-hardcoded-tables --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-opencl --enable-libx264 --enable-libmp3lame --enable-libvo-aacenc --enable-libxvid --enable-libfreetype --enable-libvpx --enable-libass --enable-libfdk-aac --enable-nonfree --enable-vda 
    libavutil  54. 27.100/54. 27.100 
    libavcodec  56. 41.100/56. 41.100 
    libavformat 56. 36.100/56. 36.100 
    libavdevice 56. 4.100/56. 4.100 
    libavfilter  5. 16.101/5. 16.101 
    libavresample 2. 1. 0/2. 1. 0 
    libswscale  3. 1.101/3. 1.101 
    libswresample 1. 2.100/1. 2.100 
    libpostproc 53. 3.100/53. 3.100 
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from './OnHub - a router for the new way to Wi-Fi-HNnfHP7VDP8.mp4': 
    Metadata: 
    major_brand  : isom 
    minor_version : 512 
    compatible_brands: isomiso2avc1mp41 
    encoder   : Lavf56.36.100 
    Duration: 00:00:53.94, start: 0.000000, bitrate: 2092 kb/s 
    Stream #0:0(und): Video: h264 (High) (avc1/0x31637661), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], 1961 kb/s, 23.98 fps, 23.98 tbr, 90k tbn, 47.95 tbc (default) 
    Metadata: 
     handler_name : VideoHandler 
    Stream #0:1(und): Audio: aac (LC) (mp4a/0x6134706D), 44100 Hz, stereo, fltp, 125 kb/s (default) 
    Metadata: 
     handler_name : SoundHandler 
[NULL @ 0x7fc07b077600] Unable to find a suitable output format for 'pipe:' 
pipe:: Invalid argument' 
+0

È possibile includere più contesto per il codice e il traceback completo? – Cyphase

+0

Questo è in realtà per il codice a parte le importazioni e le variabili per i nomi dei file. Semplice per i test. Traceback: http://pastebin.com/gDLjrHZs – Spencer

+0

È necessario includere il traceback direttamente nella domanda. E se non c'è molto più codice, perché non includerlo :)? È una buona abitudine entrare, perché anche se non importa qui, spesso può avere importanza. – Cyphase

risposta

1

Sto indovinando il problema era che avevi degli spazi in una discussione che non fuggivi. Si potrebbe semplicemente sfuggire, ma questo è un modo migliore per fare ciò che si sta cercando di fare:

import os 


directory_path = os.path.expanduser('~/Downloads/yt/') 
video_path = 'path/to/video' 
subtitles_path = 'path/to/subtitles' 
outfile_path = 'out.mp4' 

args = ['ffmpeg', '-i', video_path, '-vf', 
     'subtitles={}'.format(subtitles_path), outfile_path]] 
p = subprocess.Popen(args, cwd=directory_path) 

La differenza principale è che non si sta usando shell=True, che è buona pratica per la sicurezza e per altri motivi , incluso il fatto che non devi preoccuparti di citare argomenti con spazi. Perché non sta usando shell=True, devi passare nella riga di comando come una lista di stringhe, un elemento per argomento, invece di una stringa come prima.

+1

Per inciso, stavo lavorando a un progetto usando FFMpeg da Python non molto tempo fa. – Cyphase

+0

Fortunato me! Hah, grazie ancora uomo – Spencer

+0

Grazie per la modifica @ o11c, è decisamente meglio così. – Cyphase

Problemi correlati