ffmpeg.py 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. import os
  2. import tempfile
  3. import ffmpeg
  4. from .mytempfile import MyTempFile
  5. from .files import filename
  6. def get_audio(paths: list, audio_channel_index: int, sample_interval: list):
  7. temp_dir = tempfile.gettempdir()
  8. audio_paths = {}
  9. for path in paths:
  10. print(f"Extracting audio from {filename(path)}...")
  11. output_path = os.path.join(temp_dir, f"{filename(path)}.wav")
  12. ffmpeg_input_args = {}
  13. if sample_interval is not None:
  14. ffmpeg_input_args['ss'] = str(sample_interval[0])
  15. ffmpeg_output_args = {}
  16. ffmpeg_output_args['acodec'] = "pcm_s16le"
  17. ffmpeg_output_args['ac'] = "1"
  18. ffmpeg_output_args['ar'] = "16k"
  19. ffmpeg_output_args['map'] = "0:a:" + str(audio_channel_index)
  20. if sample_interval is not None:
  21. ffmpeg_output_args['t'] = str(
  22. sample_interval[1] - sample_interval[0])
  23. ffmpeg.input(path, **ffmpeg_input_args).output(
  24. output_path,
  25. **ffmpeg_output_args
  26. ).run(quiet=True, overwrite_output=True)
  27. audio_paths[path] = output_path
  28. return audio_paths
  29. def overlay_subtitles(subtitles: dict, output_dir: str, sample_interval: list):
  30. for path, srt_path in subtitles.items():
  31. out_path = os.path.join(output_dir, f"{filename(path)}.mp4")
  32. print(f"Adding subtitles to {filename(path)}...")
  33. ffmpeg_input_args = {}
  34. if sample_interval is not None:
  35. ffmpeg_input_args['ss'] = str(sample_interval[0])
  36. ffmpeg_output_args = {}
  37. if sample_interval is not None:
  38. ffmpeg_output_args['t'] = str(
  39. sample_interval[1] - sample_interval[0])
  40. # HACK: On Windows it's impossible to use absolute subtitle file path with ffmpeg
  41. # so we use temp copy instead
  42. # see: https://github.com/kkroening/ffmpeg-python/issues/745
  43. with MyTempFile(srt_path) as srt_temp:
  44. video = ffmpeg.input(path, **ffmpeg_input_args)
  45. audio = video.audio
  46. ffmpeg.concat(
  47. video.filter(
  48. 'subtitles', srt_temp.tmp_file_path,
  49. force_style="OutlineColour=&H40000000,BorderStyle=3"), audio, v=1, a=1
  50. ).output(out_path, **ffmpeg_output_args).run(quiet=True, overwrite_output=True)
  51. print(f"Saved subtitled video to {os.path.abspath(out_path)}.")
  52. def add_subs_new(subtitles: dict, output_dir: str, sample_interval: list):
  53. import ffmpeg as fmp
  54. input_file = list(subtitles.keys())[0]
  55. subtitle_file = subtitles[input_file]
  56. output_file = 'class.mp4'
  57. input_stream = fmp.input(input_file)
  58. subtitle_stream = fmp.input(subtitle_file)
  59. # Combine input video and subtitle
  60. output = fmp.output(input_stream, subtitle_stream, output_dir + '/' + output_file.replace('.mkv','.mp4'), c='copy', **{'c:s': 'mov_text'}, **{'metadata:s:s:0': 'language=eng'})
  61. fmp.run(output)