本文實(shí)例為大家分享了多個(gè)視頻文件合成畫中畫效果的python代碼,供大家參考,具體內(nèi)容如下
Step 1 從視頻中分離出音頻(MP4->mp3)
def separateMp4ToMp3(tmp):
mp4 = tmp.replace('.tmp', '.mp4')
print('---> Separate the video clip {0}'.format(mp4))
mp3 = tmp.replace('.tmp', '.mp3')
if os.path.exists(mp3):
print '\n\t{0} is detected. Skip. \n\tPlease delete .mp3 file if you need re-separate.'.format(mp3)
return
cmd = 'ffmpeg -i {0} -f mp3 -vn -loglevel fatal {1}'.format(mp4, mp3)
print '\t{0}'.format(cmd)
x = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
for log in x.stdout.readlines():
print '[ffmpeg info] {0}'.format(log)
for log in x.stderr.readlines():
print '[ffmpeg error] {0}'.format(log)
print '\tSuccess! {0} -> {1}\n'.format(mp4, mp3)
Step 2 根據(jù)時(shí)間軸多個(gè)音頻合成一份音頻(MP3->mp3)
def composeMp3ToMp3(arr = []):
if len(arr) =0 :
print('--->Operate audio array is empty!')
return
thisDir = os.path.dirname(arr[0])
if (os.path.exists(thisDir + "/composeAudio.mp3")):
print('--->{0}/composeAudio.mp3 is exist, if you need re-gennerate,Please delete it!'.format(thisDir))
return
print('---> Compose the audio :')
var = ''
for tem in arr:
if os.path.exists(tem) == False:
print '\n\t{0} is not exist! \n\tPlease make sure audio file be exist if you need compose.'.format(tem)
return
var = var + " -i " + tem
if var == '':
print '\n\t{0} is empty. \n\tPlease check .mp3 file if you need compose.'.format(var)
return
cmd = 'ffmpeg {0} -filter_complex amix=inputs=2:duration=first:dropout_transition=2 -f mp3 -loglevel fatal {1}/composeAudio.mp3'.format(var, thisDir)
print '\t{0}'.format(cmd)
x = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
for log in x.stdout.readlines():
print '[ffmpeg info] {0}'.format(log)
for log in x.stderr.readlines():
print '[ffmpeg error] {0}'.format(log)
print '\tSuccess! {0} -> {1}\n'.format(var, thisDir + "/composeAudio.mp3")
Step 3 多個(gè)視頻合成畫中畫效果無聲>(MP4->mp4)
def composeMp4ToMp4(arr = []):
if len(arr) = 0:
print('--->Operate video array is empty!')
return
thisDir = os.path.dirname(arr[0])
if (os.path.exists(thisDir + "/composeVideo.mp4")):
print('--->{0}/composeVideo.mp4 is exist, if you need re-gennerate,Please delete it!'.format(thisDir))
return
print('---> Compose the video :')
var = ''
temparr = []
for tem in arr:
if os.path.exists(tem) == False:
print '\n\t{0} is not exist! \n\tPlease make sure video file be exist if you need compose.'.format(tem)
return
#split image
png = tem.replace('.mp4', '.png')
tempcmd="ffmpeg -i {0} -ss 00:00:2.435 -loglevel fatal -vframes 1 {1}".format(tem, png)
print '\t{0}'.format(tempcmd)
x = subprocess.Popen(tempcmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
x.wait()
for log in x.stdout.readlines():
print'[ffmpeg info] {0}'.format(log)
for log in x.stderr.readlines():
print'[ffmpeg error] {0}'.format(log)
img = Image.open(png)
imgSize = img.size
#ipad
if (imgSize[0] > imgSize[1]) :
temparr.append(tem)
#mobile
else:
var = var + " -i " + tem
img.close()
if (len(temparr) > 0):
for tem in temparr:
var = var + " -i " + tem
if var == '':
print '\n\t{0} is empty. \n\tPlease check video file if you need compose.'.format(var)
return
cmd = 'ffmpeg ' + var + ' -filter_complex "[1:v]scale=w=176:h=144:force_original_aspect_ratio=decrease[ckout];[0:v]' \
'[ckout]overlay=x=W-w-10:y=10[out]" -map "[out]" -movflags faststart -loglevel fatal ' + thisDir + '/composeVideo.mp4'.format(var, thisDir)
print '\t{0}'.format(cmd)
x = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
for log in x.stdout.readlines():
print '[ffmpeg info] {0}'.format(log)
for log in x.stderr.readlines():
print '[ffmpeg error] {0}'.format(log)
print '\tSuccess!\n {0} -> {1}\n'.format(var, thisDir + "/composeVideo.mp4")
Step 4 音頻與視頻合成
def communicateAudioVideo(folder):
if (os.path.exists(folder + "/communicateVideo.mp4")):
print('--->{0}/communicateVideo.mp4 is exist, if you need re-gennerate,Please delete it!'.format(folder))
return
if ((os.path.exists(folder + "/composeVideo.mp4") == False) or
(os.path.exists(folder + "/composeAudio.mp3") == False)):
print('--->{0}/composeVideo.mp4 or composeAudio.mp3 must be exist!'.format(folder))
return
print('---> Communicate the video :')
cmd = 'ffmpeg -i ' + folder + '/composeVideo.mp4 -i ' + folder + '/composeAudio.mp3 -f mp4 ' \
' -loglevel fatal ' + folder +'/communicateVideo.mp4'
print '\t{0}'.format(cmd)
x = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
for log in x.stdout.readlines():
print '[ffmpeg info] {0}'.format(log)
for log in x.stderr.readlines():
print '[ffmpeg error] {0}'.format(log)
print '\tSuccess!\n {0} and {1} -> {2}\n'.format(folder + '/composeVideo.mp4', folder + '/composeAudio.mp3', folder +'/communicateVideo.mp4')
源碼下載
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
您可能感興趣的文章:- Python實(shí)現(xiàn)雙軸組合圖表柱狀圖和折線圖的具體流程
- 用Python做個(gè)個(gè)性的動(dòng)畫掛件讓桌面不單調(diào)
- 如何用Python寫一個(gè)簡(jiǎn)單的通訊錄
- 自己用python做的一款超炫酷音樂播放器
- Python做個(gè)自定義動(dòng)態(tài)壁紙還可以放視頻
- 分析總結(jié)Python數(shù)據(jù)化運(yùn)營KMeans聚類
- python中的zip模塊
- 總結(jié)分析python數(shù)據(jù)化運(yùn)營關(guān)聯(lián)規(guī)則
- python項(xiàng)目--使用Tkinter的日歷GUI應(yīng)用程序
- 如何使用Python做個(gè)自定義動(dòng)態(tài)壁紙