7

Trying to burn subs into video with ffmpeg via Python. Works fine in the command line, but when calling from Python subprocess with:

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)

I get:

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

Full traceback:

'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'
13
  • Can you include more context for the code, and the full traceback? Commented Aug 27, 2015 at 6:07
  • That's actually it for the code aside from the imports and variables for the filenames. Simple for testing. Traceback: pastebin.com/gDLjrHZs Commented Aug 27, 2015 at 6:09
  • You should include the traceback directly in the question. And if there's not much more code, why not include it :)? It's a good habit to get into, because even if it doesn't matter here, it often can matter. Commented Aug 27, 2015 at 6:11
  • 1
    Try printing - print('cd ~/Downloads/yt/; ffmpeg -i ./{video} -vf subtitles=./{subtitles} {out}.mp4'.format(video=vid.replace(' ', '\ '), subtitles=subs, out='out.mp4')) - check the output to see any issues/difference between what you run directly in command line. Commented Aug 27, 2015 at 6:15
  • 1
    Try this: p = subprocess.Popen(['ffmpeg', '-i', 'path/to/video', '-vf', 'subtitles=path/to/subtitles', 'out.mp4']) Commented Aug 27, 2015 at 6:25

1 Answer 1

2

I'm guessing the problem was that you had spaces in some argument that you weren't escaping. You could just escape it, but this is a better way to do what you're trying to do:

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)

The main difference is that you're not using shell=True, which is good practice for security and other reasons, including the fact that you don't have to worry about quoting arguments with spaces. Because it's not using shell=True, you have to pass in the command line as a list of strings, one element per argument, instead of one string like before.

Sign up to request clarification or add additional context in comments.

2 Comments

Incidentally, I was working on a project using FFMpeg from Python not too long ago.
Thanks for the edit @o11c, it's definitely better like that.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.