|
|
import os |
|
|
import ffmpeg |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def concatenate_ts_files(folder, video_name, batch_counts): |
|
|
"""Concatenate batch TS files into final mp4.""" |
|
|
inputs_path = os.path.join(folder, 'inputs.txt') |
|
|
|
|
|
|
|
|
with open(inputs_path, 'w') as f: |
|
|
for i in range(batch_counts): |
|
|
f.write(f"file '{video_name}_b{i:04d}.ts'\n") |
|
|
|
|
|
|
|
|
ffmpeg.input(inputs_path, format='concat', safe=0).output( |
|
|
os.path.join(folder, f'{video_name}.mp4'), |
|
|
c='copy' |
|
|
).run() |
|
|
|
|
|
|
|
|
for i in range(batch_counts): |
|
|
os.remove(os.path.join(folder, f"{video_name}_b{i:04d}.ts")) |
|
|
os.remove(inputs_path) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def create_ffmpeg_writer(output_path, width, height, fps, crf): |
|
|
"""Spawn an ffmpeg async encoding process for writing raw frames.""" |
|
|
return ( |
|
|
ffmpeg.output( |
|
|
ffmpeg.input( |
|
|
'pipe:0', |
|
|
format='rawvideo', |
|
|
pix_fmt='rgb24', |
|
|
s=f'{width}x{height}', |
|
|
r=fps, |
|
|
), |
|
|
output_path, |
|
|
**{ |
|
|
'preset': 'medium', |
|
|
'pix_fmt': 'yuv420p', |
|
|
'b:v': '0', |
|
|
'c:v': 'libx264', |
|
|
'crf': str(crf), |
|
|
'r': fps, |
|
|
} |
|
|
) |
|
|
.overwrite_output() |
|
|
.run_async(quiet=True, pipe_stdin=True) |
|
|
) |