2012-05-01 1 views
6

파이썬의 서브 프로세스 모듈에서 ffmpeg를 사용하여 일부 오디오 파일을 변환하려고합니다. URL에서 오디오 파일을 가져 와서 디스크에 저장하는 대신 파이썬 파일 객체를 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/write에서 stdout으로 데이터를 읽어야 함을 나타낼 수 있습니다.

그런 다음 의 stdin/stdout 인수를 사용하여 데이터를 읽고 쓸 수 있습니다.

예 :

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 

대신 당신은 또한 PIPE를 사용하여 프로세스의 입력 스트림 ( p.stdin)에 직접 쓸 수 stdin에 대한 파일을 제공. 또는 귀하의 경우에는 단순히 wav 파일을 사용하는 것이 좋습니다 ...

ffmpeg는 일반적으로 파일 확장자에서 추측 할 수 없으므로 출력 형식과 코덱을 명시 적으로 지정해야합니다.
그리고 검색 가능한 출력 스트림이 필요없는 muxers에서만 작동하지만 flac은 작동해야합니다.

0

유닉스 ('는 FFmpeg'의 말에 아무런 .EXE)에있어 것 같습니다 때문에, 나는 일명 FIFO, 명명 된 파이프를 사용하는 것이 좋습니다 것입니다 다음 쓰기

mkfifo multimedia-pipe 

파이썬 스크립트를 가지고 오디오 데이터를 '멀티미디어 파일'에 저장하고 FFmpeg에 같은 파일을 읽도록 요청합니다. 필자는이 패턴을 사용하여 디스크 공간을 차지할 필요없이 멀티미디어 파일을 유효성 검증을위한 거대한 원시 표현으로 디코딩했습니다.

또는 'http : // ...'URL을 FFmpeg의 입력 옵션에 직접 전달해보십시오.

관련 문제