add audio support
This commit is contained in:
parent
506f1b7d97
commit
79bf618978
43
cas.py
43
cas.py
@ -2,10 +2,11 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
from argparse import ArgumentParser
|
from argparse import ArgumentParser
|
||||||
from tempfile import TemporaryDirectory
|
from tempfile import TemporaryDirectory, NamedTemporaryFile
|
||||||
import logging
|
import logging
|
||||||
import cv2
|
import cv2
|
||||||
import asyncio
|
import asyncio
|
||||||
|
import ffmpeg
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from wand.image import Image
|
from wand.image import Image
|
||||||
|
|
||||||
@ -66,15 +67,15 @@ ap.add_argument(
|
|||||||
)
|
)
|
||||||
ap.add_argument(
|
ap.add_argument(
|
||||||
'--vibrato-frequency','--vibrato-freq', '-f',
|
'--vibrato-frequency','--vibrato-freq', '-f',
|
||||||
default = 5.0,
|
default = 10.0,
|
||||||
type = float,
|
type = float,
|
||||||
help = 'Modulation frequency in Hertz. Range is 0.1 - 20000.0. Default value is 5.0 Hz.'
|
help = 'Modulation frequency in Hertz. Range is 0.1 - 20000.0. Default value is 10.0 Hz.'
|
||||||
)
|
)
|
||||||
ap.add_argument(
|
ap.add_argument(
|
||||||
'--vibrato-modulation-depth','--vibrato-depth', '-m',
|
'--vibrato-modulation-depth','--vibrato-depth', '-m',
|
||||||
default = 0.5,
|
default = 1.0,
|
||||||
type = float,
|
type = float,
|
||||||
help = 'Depth of modulation as a percentage. Range is 0.0 - 1.0. Default value is 0.5.'
|
help = 'Depth of modulation as a percentage. Range is 0.0 - 1.0. Default value is 1.0.'
|
||||||
)
|
)
|
||||||
ap.add_argument(
|
ap.add_argument(
|
||||||
'--debug',
|
'--debug',
|
||||||
@ -170,6 +171,23 @@ async def distort_video(capture, output, distort_start, distort_end=None, distor
|
|||||||
|
|
||||||
log.debug('done with distorting video frames')
|
log.debug('done with distorting video frames')
|
||||||
|
|
||||||
|
def distort_audio(distorted_video, in_audio, audio_freq, audio_mod, out_filename):
|
||||||
|
video = ffmpeg.input(distorted_video).video
|
||||||
|
audio = ffmpeg.input(in_audio).audio.filter(
|
||||||
|
"vibrato",
|
||||||
|
f=audio_freq,
|
||||||
|
d=audio_mod
|
||||||
|
# Documentation : https://ffmpeg.org/ffmpeg-filters.html#vibrato
|
||||||
|
)
|
||||||
|
(
|
||||||
|
ffmpeg
|
||||||
|
.concat(video, audio, v=1, a=1) # v = video stream, a = audio stream
|
||||||
|
.output(out_filename)
|
||||||
|
.run(overwrite_output=True)
|
||||||
|
# Documentation : https://kkroening.github.io/ffmpeg-python/
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
args = ap.parse_args()
|
args = ap.parse_args()
|
||||||
if args.debug:
|
if args.debug:
|
||||||
@ -184,12 +202,17 @@ def main():
|
|||||||
fps = capture.get(cv2.CAP_PROP_FPS)
|
fps = capture.get(cv2.CAP_PROP_FPS)
|
||||||
video_width = int(capture.get(cv2.CAP_PROP_FRAME_WIDTH))
|
video_width = int(capture.get(cv2.CAP_PROP_FRAME_WIDTH))
|
||||||
video_height = int(capture.get(cv2.CAP_PROP_FRAME_HEIGHT))
|
video_height = int(capture.get(cv2.CAP_PROP_FRAME_HEIGHT))
|
||||||
frames = args.distort_end or int(capture.get(cv2.CAP_PROP_FRAME_COUNT))
|
frames = int(capture.get(cv2.CAP_PROP_FRAME_COUNT))
|
||||||
log.info("video: name:'%s', fps:%i, frames:%i, size:%ix%i", args.input, fps, frames, video_width, video_height)
|
log.info("video: name:'%s', fps:%i, frames:%i, size:%ix%i", args.input, fps, frames, video_width, video_height)
|
||||||
output = cv2.VideoWriter(args.output, cv2.VideoWriter_fourcc(*'mp4v'), fps, (video_width, video_height))
|
if args.distort_end:
|
||||||
asyncio.run(distort_video(capture, output, args.distort_percentage, args.distort_percentage_end, frames-1))
|
frames *= (args.distort_end / 100.)
|
||||||
capture.release()
|
with TemporaryDirectory() as tmpout:
|
||||||
output.release()
|
tmpout = Path(tmpout) / 'tmp.mp4'
|
||||||
|
output = cv2.VideoWriter(str(tmpout), cv2.VideoWriter_fourcc(*'mp4v'), fps, (video_width, video_height))
|
||||||
|
asyncio.run(distort_video(capture, output, args.distort_percentage, args.distort_percentage_end, frames-1))
|
||||||
|
capture.release()
|
||||||
|
output.release()
|
||||||
|
distort_audio(tmpout, args.input, args.vibrato_frequency, args.vibrato_modulation_depth, args.output)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
|
Loading…
Reference in New Issue
Block a user