2012-05-01 8 views
6

मैं पायथन के उपप्रक्रिया मॉड्यूल के साथ ffmpeg उपयोग करने के लिए कुछ ऑडियो फ़ाइलें कन्वर्ट करने के लिए कोशिश कर रहा हूँ से अजगर के साथ ffmpeg का उपयोग करते हैं। मैं एक यूआरएल से ऑडियो फाइलों को पकड़ता हूं और केवल पाइथन फ़ाइल ऑब्जेक्ट्स को ffmpeg पर पास करने में सक्षम होना चाहता हूं, बजाय उन्हें डिस्क पर सहेजने की बजाय। यह बहुत अच्छा होगा अगर मैं ffmpeg को फ़ाइल में आउटपुट सहेजने की बजाय फ़ाइल स्ट्रीम वापस प्राप्त कर सकता हूं।मैं कैसे फ़ाइल ऑब्जेक्ट (फ़ाइलों को डिस्क पर स्थानों के बजाय) गुजर

tmp = "/dev/shm" 
audio_wav_file = requests.get(audio_url) 
##    ##       ## 
## This is what I don't want to have to do ## 
wavfile = open(tmp+filename, 'wrb') 
wavfile.write(audio_wav_file.content) 
wavfile.close() 
##    ##       ## 
conversion = subprocess.Popen('ffmpeg -i "'+tmp+filename+'" -y "'+tmp+filename_noext+'.flac" 2>&1', shell = True, stdout = subprocess.PIPE).stdout.read() 

किसी को भी ऐसा करने के तरीके पता है:

संदर्भ के लिए, यह अब मैं क्या कर रहा है?

धन्यवाद!

उत्तर

7

ffmpeg के साथ संकेत मिलता है कि यह/stdin से डेटा पढ़ना चाहिए stdout में लिखने के रूप में इनपुट/आउटपुट फ़ाइल नाम - उपयोग कर सकते हैं।

फिर आप अपने डेटा को पढ़ने/लिखने के लिए stdin/stdoutPopen के तर्कों का उपयोग कर सकते हैं।

एक उदाहरण:

from subprocess import Popen, PIPE 

with open("test.avi", "rb") as infile: 
    p=Popen(["ffmpeg", "-i", "-", "-f", "matroska", "-vcodec", "mpeg4", 
     "-acodec", "aac", "-strict", "experimental", "-"], 
      stdin=infile, stdout=PIPE) 
    while True: 
     data = p.stdout.read(1024) 
     if len(data) == 0: 
      break 
     # do something with data... 
     print(data) 
    print p.wait() # should have finisted anyway 

बजाय आप stdin के लिए एक फ़ाइल की आपूर्ति आप भी एक PIPE का उपयोग करें और प्रक्रियाओं इनपुट स्ट्रीम (p.stdin) को सीधे लिख सकते हैं। या आपके मामले में आप बस wavfile का उपयोग करेंगे ...

ध्यान दें कि आपको आउटपुट प्रारूप और कोडेक्स स्पष्ट रूप से निर्दिष्ट करना है, क्योंकि ffmpeg उन्हें फ़ाइल एक्सटेंशन से आमतौर पर अनुमानित नहीं कर सकता है।
और यह केवल muxers कि seekable आउटपुट स्ट्रीम की जरूरत नहीं है के लिए काम करेंगे, लेकिन flac काम करना चाहिए ...

0

के बाद से ऐसा लगता है कि आप यूनिक्स ('ffmpeg' के अंत पर कोई .exe) पर हैं, मैं एक नामित पाइप का उपयोग करना चाहिये होगा, उर्फ ​​फीफो:

mkfifo multimedia-pipe 

अजगर स्क्रिप्ट है लिखना 'मल्टीमीडिया-फाइल' में ऑडियो डेटा और उसी फ़ाइल से पढ़ने के लिए एफएफएमपीईजी से पूछें। मैंने मल्टीमीडिया फ़ाइलों को डिस्क स्पेस पर कब्जा किए बिना सत्यापन के लिए अपने विशाल, कच्चे प्रतिनिधित्व में डीकोड करने के लिए इस पैटर्न का उपयोग किया है। यूआरएल FFmpeg के इनपुट विकल्प के लिए सीधे:

वैकल्पिक रूप से, गुजर कोशिश '// ... http'।

संबंधित मुद्दे