2013-06-26 2 views
3

여기서 "path/connect.webm"에서 첫 번째 및 두 번째 30 초 길이의 비디오 파일을 문자열 out 및 out1로 자르려고했습니다. 그것은 작동합니다. 하지만 내가해야 할 일은이 두 문자열을 연결하고이를 "path/final.webm"파일에 쓰는 것입니다. 그래서 60 초 길이의 비디오 파일 인 "final.webm"이 마지막에 나옵니다. 하지만 이제는 출력으로 만 첫 30 초 길이의 비디오를 얻습니다. 도와주세요. 많은 감사드립니다. 파이썬에서파이썬을 사용하여 두 개의 비디오 파일을 결합하는 방법은 무엇입니까?

코드 :

import subprocess,os 

fname = "/home/xincoz/test/final.webm" 

fp = open(fname,'wb') 

ffmpeg_command = ["ffmpeg", "-i", "/home/xincoz/test/connect.webm", "-acodec", "copy", "-ss", "00:00:00", "-t", "00:00:30","-f", "webm", "pipe:1"] 

p = subprocess.Popen(ffmpeg_command,stdout=subprocess.PIPE) 

out, err = p.communicate() 

ffmpeg_command1 = ["ffmpeg", "-i", "/home/xincoz/test/connect.webm", "-acodec", "copy", "-ss", "00:00:31", "-t", "00:00:30","-f", "webm", "pipe:1"] 

p1 = subprocess.Popen(ffmpeg_command1,stdout=subprocess.PIPE) 

out1, err1 = p1.communicate() 

string = out + out1 

print len(out) 

print len(out1) 

print len(string) 

fp.write(string) 

fp.close() 

제발 도와주세요.

+1

@sean 답장을 보내 주셔서 감사합니다. 파이썬을 서버 측에서 사용하여 시간별로 비디오를 분할합니다. 그리고 모든 부분을 클라이언트 측의 단일 파일로 다시 연결하려고합니다. 그래서 형제 야. 이것을 달성 할 수있는 방법이 있습니까? – rash

+1

절대적으로 그것이 내가 형제 @sean을 원했던 것입니다. ffmpeg를 사용하여 코드를 어떻게 변경해야합니까? – rash

답변

6

이 코드는 저에게 적합합니다. 큰 도움을 주셔서 감사합니다. 고마워.

import subprocess 
ffmpeg_command1 = ["ffmpeg", "-i", "/home/xincoz/test/connect.webm", "-acodec", "copy", "-ss", "00:00:00", "-t", "00:00:30", "/home/xincoz/test/output1.webm"] 
ffmpeg_command2 = ["ffmpeg", "-i", "/home/xincoz/test/connect.webm", "-acodec", "copy", "-ss", "00:00:30", "-t", "00:00:30", "/home/xincoz/test/output2.webm"] 
ffmpeg_command3 = ["mencoder", "-forceidx", "-ovc", "copy", "-oac", "pcm", "-o", "/home/xincoz/test/output.webm", "/home/xincoz/test/output1.webm", "/home/xincoz/test/output2.webm"] 


subprocess.call(ffmpeg_command1) 
subprocess.call(ffmpeg_command2) 
subprocess.Popen(ffmpeg_command3) 
+0

그러나 원본 파일에 비해 출력 파일 크기가 크게 증가합니다. – rash

-1

-i infile1 .... -i infile2 .... outfile을 지정하면 ffmpeg가 필요한 것을 수행 할 것이라고 생각합니다.

+0

답장을 보내 주셔서 감사합니다. ffmpeg -i output1.flv -i output2.flv -vcodec 복사 -acodec copy \ -vcodec 복사 -acodec copy output3.flv -newvideo -newaudio이 방법을 사용하여 두 파일을 결합 할 수 있습니다. 하지만 대신 두 개의 문자열에 가입하고 싶습니다. – rash

5

이것은 프로그래밍을 통해 처음으로 비디오를 다룰 때 어떤 합리적인 사람이 묻는 두 가지 질문 중 하나와 같습니다. '왜 내가 원하는 부분을 자르고 붙일 수없는거야?' 정말로 설명 할 수있는 사람들이 질문에 질리고, 나 자신과 같은 사람이 다소 어리석은 짓을하고 싶지 않기 때문에 아무도 대답하지 않습니다. 그러나 나는 상관하지 않습니다. 그래서 실제적인 대답이 있습니다.

복잡한 컨테이너 형식을 클립하고 결합하려면 항상 생각보다 복잡하고 최소한 컨테이너 당 솔루션이 필요합니다.

ffmpeg faq를 읽는다면 이론적으로 mpg-v1 (아마도 mpg-v2도 작동 함) 형식으로 비디오를 연결 한 다음 더 많거나 적은 일을하고있을 수 있습니다.

cat first_part.mpg second_part.mpg > joined_movie.mpg 

실제로 joined_movie.mpg는 원활하게 실행되거나 실행되지 않을 수 있습니다. 이 단순한 형식 일지라도, "이 파일은 아주 오래되었습니다"라고 말하는 데이터가 있습니다. 그래서 당신은 그것을 열어서 30 초 밖에 걸리지 않을 것이라고 생각하지만, 그것은 1 분 동안 (또는 플레이어에 따라) 재생되는 것을 알 수 있습니다. 그것은 쉽게 바르게 될 수 있습니다 (그리고 저는 무손실로 가정합니다, 또는 ffmpeg faq에서 권장하지 않을 것입니다).

하지만 궁극적으로 mpg-v1을 사용하고 싶지 않을 것입니다. Webm은 합리적인 선택 일 수 있습니다. 내가 수집 한 것에서 webm 컨테이너는 MKV에서 파생되었습니다. 오디오의 경우 vorbis를 사용하고 비디오의 경우 vp8을 사용합니다. 한 평신도 : vp8 ~ H264 (이 글을 읽고 심장 마비가있는 doom9 포럼의 누군가에게 사과드립니다.) 어쨌든, 우리 laypeople에 대한 중요한 포인트입니다 : 이것은 단순하지 않다는 것을 의미하지만 실제로는 매우 복잡합니다. 심지어 모든 인코더 파라미터를 이해하는 것조차도 인생의 일입니다.

나는 mp4box가 mp4 컨테이너 안에 h264 비디오로 원하는 것을 가까이서 꽤 잘 할 수 있다는 것을 알고있다. 프로그래밍 방식으로 비디오를 자르고 결합 할 수 있기를 원한다면 mp4/h264를 채택 할 수는 있지만, 자유롭고 자유롭지 않을 수 있으며 이데올로기 적 또는 금전적 인 이유로 webm을 사용하고자 할 수 있습니다. webm에서 솔루션을 찾으면 궁금 할 것입니다. 아마도 mkvtool은 mkv 컨테이너와의 근접성을 고려할 때 작동할까요?

웹 비디오에 관해 이야기 할 때 파일이 스트리밍되기에 충분하다고 생각합니다. 그래서 당신이 진짜로 정말로 그들을 함께 추가 할 수 있어야하는 것처럼 보일지도 모릅니다. 그러나 청크에 의해 인터리브 된 모든 것조차도, 그냥 추가하는 것보다 훨씬 복잡하거나 심지어 전체 재생 시간에 대한 헤더/메타 데이터를 조정하여 추가해야합니다. 나는 많은 도구가 작동하지 않을 것 같고 mp4box조차도 이것을 항상 정확하게/신뢰할 수 없다고 생각하기 때문에 복잡성을 추측합니다.당신이 MP4로 갈 경우

, 당신의 파일을 가입 mp4box를 알 수 있습니다 :

mp4box -cat file1 -cat file2 -new joined 

아마도 자유 소프트웨어 애국자 잘라도 재 인코딩없이 명령 줄에서 WEBM 파일을 결합하는 방법을 게시 할 예정입니다.

프로젝트에 대한 행운을 빕니다.

관련 문제