mp4を音声なしmp4とmp3に分割する
mp4を分割したとき音声と映像の長さ同じようになるよう、fpsを調整している。(映像側を音声の長さに合わせている)
import cv2
import glob
from pydub import AudioSegment #音声操作用 mp3関連の処理
import ffmpeg
print('mp4を音声なしmp4とmp3に分割する。')
# mp4を音声なしmp4とmp3に分割する。
# @param string input_fp 入力動画ファイルパス
# @param string output_mp4_fp 出力動画ファイルパス(音声なしmp4)
# @param string output_mp3_fp 出力音声ファイルパス(mp3)
#
def splitVideoAndSound(input_fp, output_mp4_fp, output_mp3_fp):
sound = AudioSegment.from_file(input_fp, "mp4")
sound_sec = sound.duration_seconds # 再生時間
print(f'音声ファイルの長さ={str(sound_sec)}')
movie = cv2.VideoCapture(input_fp)
width = movie.get(cv2.CAP_PROP_FRAME_WIDTH)
height = movie.get(cv2.CAP_PROP_FRAME_HEIGHT)
video_frame_count = movie.get(cv2.CAP_PROP_FRAME_COUNT) # フレーム数を取得する
video_fps = movie.get(cv2.CAP_PROP_FPS)
print(f'入力動画ファイルのFPS={str(video_fps)}')
#video_time = (video_fps * video_frame_count) / 1000
print(f'入力動画ファイルのフレーム数={str(video_frame_count)}')
output_video_fps = video_frame_count / sound_sec
print(f'出力動画ファイルのfps={str(output_video_fps)}')
# 出力動画ファイルの用意(mp4)
fourcc = cv2.VideoWriter_fourcc('m','p','4','v')
output = cv2.VideoWriter(output_mp4_fp, int(fourcc), output_video_fps, (int(width), int(height)))
print(f'{output_mp4_fp}の出力開始')
while True:
ret, frame = movie.read()
output.write(frame)
if not ret:
break
# 映像オブジェクトの解放
movie.release()
print(f'{output_mp4_fp}の出力完了')
# 音声ファイルの出力
sound.export(output_mp3_fp, format="mp3")
print(f'{output_mp3_fp}の出力完了')
input_fp = 'test_data/MVI_0887.MP4'
output_mp4_fp = 'test_data/output10.mp4'
output_mp3_fp = 'test_data/output10.mp3'
splitVideoAndSound(input_fp, output_mp4_fp, output_mp3_fp)
print('Success')
ソースコードGitHub
pydubでmp3のカット
print ('pydubでmp3のカット')
# pydubを使うにはffmpegが必要-
from pydub import AudioSegment
audio = AudioSegment.from_file("./test_data/test3.mp3", "mp3")
# 5000ms~10000ms(5~10秒)を抽出
audio2 = audio[0:14000]
# 変換したオーディオオブジェクトを出力
audio2.export("./test_data/output08.mp3", format="mp3")
print('OK')
pudubで再生時間、サンプリングレート(Hz)、チャンネル数を取得する
audio = AudioSegment.from_file(movie_fn, "mp4")
time = audio.duration_seconds # 再生時間(秒)
rate = audio.frame_rate # サンプリングレート(Hz)
channel = audio.channels # チャンネル数(1:モノラル, 2:ステレオ)
cv2で動画再生速度の変更 | fpsの変更
import cv2
import glob
from pydub import AudioSegment #音声操作用 mp3関連の処理
import ffmpeg
print('FPS変更 動画再生速度の変更を検証する')
# 動画の再生速度を変更する
# @param string input_fp 入力動画ファイルパス
# @param string output_fp 出力動画ファイルパス
# @param rete 変更後の再生速度倍率 例:0.5→1/2のスローモーション, 2.0→2倍速再生
#
def chageMovieSpeed(input_fp, output_fp, rate):
# mp4を設定
fourcc = cv2.VideoWriter_fourcc('m','p','4','v')
movie = cv2.VideoCapture(input_fp)
fps = int(movie.get(cv2.CAP_PROP_FPS))
print(f'変更前fps={str(fps)}')
width = movie.get(cv2.CAP_PROP_FRAME_WIDTH)
height = movie.get(cv2.CAP_PROP_FRAME_HEIGHT)
fps2 = fps * rate
print(f'変更後fps={str(fps2)}')
output = cv2.VideoWriter(output_fp, int(fourcc), fps2, (int(width), int(height)))
while True:
ret, frame = movie.read() # フレームを取得
output.write(frame) # 動画を保存する
# フレームが取得できない場合はループを抜ける
if not ret:
break
# 撮影用オブジェクトとウィンドウの解放
movie.release()
input_fp = 'test_data/MVI_0887.MP4'
output_fp = 'test_data/output09.mp4'
rate = 0.5 # 変更後の再生速度倍率 例:0.5→1/2のスローモーション, 2.0→2倍速再生
chageMovieSpeed(input_fp, output_fp, rate)
print('Success')
ソースコードGitHub
xxx
- ホーム
- プログラミングの覚書
- Pythonの覚書
- ffmpegの覚書