Exemplo n.º 1
0
def encode():
    # Configure objetcts
    config = util.Config('config.json')
    sl = util.check_system()['sl']

    # Create video object and your main folders
    video = util.VideoParams(config=config,
                             yuv=f'..{sl}yuv-full',
                             hevc_base='hevc',
                             mp4_base='mp4',
                             segment_base='segment',
                             dectime_base='dectime')

    # Set basic configuration
    video.encoder = 'ffmpeg'
    video.project = 'ffmpeg_crf_18videos_60s'
    video.factor = 'crf'

    # iterate over 3 factors: video (complexity), tiles format, quality
    for video.name in config.videos_list:
        for video.tile_format in config.tile_list:
            for video.quality in getattr(config, f'{video.factor}_list'):
                util.encode(video)
                # util.encapsule(video)
                # util.extract_tile(video)
                util.make_segments(video)
Exemplo n.º 2
0
def main():
    programs = util.check_system()
    kvazaar = programs['kvazaar']
    sl = programs['sl']

    # videos = util.list_videos('input.json')

    videos = {"pac_man": 0, "rollercoaster": 0, "lions": 0, "om_non": 0}
    videos = {"om_nom": 0}

    for name in videos:
        for tile in tile_list:
            m, n = list(map(int, tile.split('x')))
            for rate, qp in list(zip(rate_list, qp_list)):
                for tile_count in range(1, (m * n) + 1):
                    folder = f'{name}_{scale}_{fps}_{tile}'
                    filename = f'{folder}_tile{tile_count}'
                    filepath_in = f'yuv{sl}{folder}{sl}{filename}.yuv'

                    os.makedirs(f'hevc{sl}{folder}', exist_ok=True)
                    filepath_out_rate = f'hevc{sl}{folder}{sl}{folder}_rate{rate}_tile{tile_count}'
                    filepath_out_qp = f'hevc{sl}{folder}{sl}{folder}_qp{qp}_tile{tile_count}'
                    params_common = (f'--input {filepath_in} '
                                     f'--input-res {scale} '
                                     f'--input-fps {fps} '
                                     f'-p {gop} '
                                     '--no-tmvp '
                                     '--no-open-gop')
                    params_rate = f'{params_common} --bitrate {rate} --output {filepath_out_rate + ".hevc"}'
                    params_qp = f'{params_common} --qp {qp} --output {filepath_out_qp + ".hevc"}'

                    if os.path.isfile(filepath_out_rate + '.hevc'):
                        print(
                            f'arquivo {filepath_out_rate + ".hevc"} existe. Pulando.'
                        )
                    else:
                        command = f'{kvazaar} {params_rate}'
                        with open(filepath_out_rate + '.log',
                                  'w',
                                  encoding='utf-8') as f:
                            print(command)
                            subprocess.run(command,
                                           shell=True,
                                           stdout=f,
                                           stderr=subprocess.STDOUT)

                    if os.path.isfile(filepath_out_qp + '.hevc'):
                        print(
                            f'arquivo {filepath_out_qp + ".hevc"} existe. Pulando.'
                        )
                    else:
                        command = f'{kvazaar} {params_qp}'
                        with open(filepath_out_qp + '.log',
                                  'w',
                                  encoding='utf-8') as f:
                            print(command)
                            subprocess.run(command,
                                           shell=True,
                                           stdout=f,
                                           stderr=subprocess.STDOUT)
def main():
    programs = util.check_system()
    sl = programs['sl']
    mp4client = programs['mp4client']

    qp_list = [20, 25, 30, 35, 40]
    rate_list = [2000000, 4000000, 8000000, 16000000, 24000000]
    # rate_list = [8000000]
    tile_list = ['1x1', '6x4', '12x8']
    # tile_list = ['12x8']
    # videos = util.list_videos('input.json')

    # videos = {"pac_man": 0,
    #           "rollercoaster": 0,
    #           "lions": 0,
    #           "om_nom": 0}
    videos = {'rollercoaster': 0, 'lions': 0}

    for i in range(1):
        for name in videos:
            for tile in tile_list:
                m, n = list(map(int, tile.split('x')))
                for rate, qp in list(zip(rate_list, qp_list)):
                    out_folder = f'dectime{sl}{name}_{tile}_rate{rate}'
                    os.makedirs(out_folder, exist_ok=True)

                    for t in range(1, m * n + 1):
                        for chunk in range(1, duration + 1):
                            video_path = f'dash{sl}{name}_{scale}_{fps}_{tile}_rate{rate}{sl}segments{sl}{name}_tile{t}_track{t + 1}_{chunk:03}'
                            log_path = f'{out_folder}{sl}{name}_tile{t}_{chunk:03}'

                            command = f'start /b /wait /affinity 0x800 {mp4client} -bench {video_path}.mp4'
                            print('\n' + command)

                            while True:
                                with open('temp.tmp', 'w',
                                          encoding='utf-8') as f1:
                                    p = subprocess.run(
                                        command,
                                        shell=True,
                                        stdout=f1,
                                        stderr=subprocess.STDOUT)
                                print(f'returncode = {p.returncode}')

                                if p.returncode == 0:
                                    with open('temp.tmp', 'r', encoding='utf-8') as f1, \
                                            open(f'{log_path}.log', 'a', encoding='utf-8') as f2:
                                        f2.write(f1.read())
                                        break
                                else:
                                    print(
                                        f'Algum erro. Exitcode == {p.returncode}. Tentando novamente.'
                                    )
Exemplo n.º 4
0
def main():
    programs = util.check_system()
    mp4box = programs['mp4box']
    sl = programs['sl']

    # videos = util.list_videos('input.json')

    videos = {"pac_man": 0}
    # "rollercoaster": 0,
    # "lions": 0,
    # "om-non": 0}

    for name in videos:
        for tile in tile_list:
            m, n = list(map(int, tile.split('x')))
            for rate, qp in list(zip(rate_list, qp_list)):
                for tile_count in range(1, (m * n) + 1):
                    basename = f'{name}_{scale}_{fps}_{tile}'
                    mp4_folder = f'mp4{sl}{basename}'

                    rate_name = f'{basename}_rate{rate}_tile{tile_count}'
                    qp_name = f'{basename}_rate{rate}_tile{tile_count}'

                    rate_dash_folder = f'{mp4_folder}{sl}rate_dash'
                    qp_dash_folder = f'{mp4_folder}{sl}qp_dash'

                    rate_ini_name = f'{rate_name}_dashinit.mp4'
                    qp_ini_name = f'{qp_name}_dashinit.mp4'

                    with open(f'{rate_dash_folder}{sl}{rate_ini_name}', 'rb') as f_rate_ini, \
                            open(f'{qp_dash_folder}{sl}{qp_ini_name}', 'rb') as f_qp_ini:

                        for chunk in range(1, duration + 1):
                            dash_rate_name = f'{basename}_rate{rate}_tile{tile_count}_dash{chunk}'
                            with open(f'{rate_dash_folder}{sl}{dash_rate_name}.m4s', 'rb') as f_rate_chunk, \
                                    open(f'{rate_dash_folder}{sl}{dash_rate_name}.mp4', 'wb') as f_rate_chunk_mp4:
                                f_rate_chunk_mp4.write(f_rate_ini.read())
                                f_rate_chunk_mp4.write(f_rate_chunk.read())

                            dash_qp_name = f'{basename}_rate{rate}_tile{tile_count}_dash{chunk}'
                            with open(f'{qp_dash_folder}{sl}{dash_qp_name}.m4s', 'rb') as f_qp_chunk, \
                                    open(f'{qp_dash_folder}{sl}{dash_qp_name}.mp4', 'wb') as f_qp_chunk_mp4:
                                f_qp_chunk_mp4.write(f_rate_ini.read())
                                f_qp_chunk_mp4.write(f_qp_chunk.read())

    if __name__ == '__main__':
        main()
Exemplo n.º 5
0
def main():
    programs = util.check_system()
    sl = programs['sl']
    ffmpeg = programs['ffmpeg']

    with open('input.json', 'r') as f:
        video_list = json.load(f)

    p_count = 0
    proc = []
    for name in video_list:
        ss = video_list[name]
        base_name = f'{name}_{scale}_{fps}'
        folder_in = f'original{sl}'
        folder_out = f'yuv{sl}'
        filepath_in = f'{folder_in}{name}.mp4'
        filepath_out = f'{folder_out}{base_name}.yuv'

        os.makedirs(folder_out, exist_ok=True)

        par_in = ('-n -hide_banner ' f'-ss {ss} ' f'-i {filepath_in}')
        par_out = (f'-t {duration} '
                   f'-r {fps} '
                   f'-vf scale={scale} '
                   '-map 0:0 '
                   f'{filepath_out}')

        command = f'{ffmpeg} {par_in} {par_out}'
        print(command + '\n')

        p = subprocess.Popen([command], shell=True, stderr=subprocess.DEVNULL)
        proc.append(p)
        p_count += 1

        while p_count >= 3:
            time.sleep(1)
            print('.', end='', flush=True)
            for p in proc:
                if p.poll() is not None:
                    print('\nConcluindo processo :')
                    proc.remove(p)
                    p_count -= 1
                    break

    for p in proc:
        p.wait()
def main():
    sl = util.check_system()['sl']

    # videos = util.list_videos('input.json')

    videos = {"rollercoaster": 0, "lions": 0}

    for name in videos:
        for tile in tile_list:
            for rate, qp in list(zip(rate_list, qp_list)):
                # ----------------------------------------------
                # Encode
                # ----------------------------------------------
                yuv_video_name = f'yuv{sl}{name}_{scale}_{fps}'

                hevc_video = util.encode(name=name,
                                         scale=scale,
                                         gop=gop,
                                         fps=fps,
                                         tile=tile,
                                         yuv_video_name=yuv_video_name,
                                         quality=rate,
                                         factor='rate')

                # ----------------------------------------------
                # Encapsule
                # ----------------------------------------------
                mp4_video = util.encapsule(name=name,
                                           scale=scale,
                                           fps=fps,
                                           tile=tile,
                                           hevc_video=hevc_video,
                                           quality=rate,
                                           factor='rate')

                # ----------------------------------------------
                # Extract and segment Tiles
                # ----------------------------------------------
                util.extract_segment(name=name,
                                     scale=scale,
                                     fps=fps,
                                     tile=tile,
                                     mp4_video=mp4_video,
                                     quality=rate,
                                     factor='rate')
def encode():
    config = util.Config('config.json')
    sl = util.check_system()['sl']

    video = util.VideoParams(config=config,
                             yuv=f'..{sl}yuv-full',
                             hevc_base='hevc',
                             mp4_base='mp4',
                             segment_base='segment',
                             dectime_base='dectime',
                             project='ffmpeg-60s-qp',
                             encoder='ffmpeg',
                             factor='crf')

    # for video.name in config.videos_list:
    for video.name in ['om_nom', 'rollercoaster']:
        for video.tile_format in config.tile_list:
            for video.quality in getattr(config, f'{video.factor}_list'):
                util.encode(video)
def main():
    programs = util.check_system()
    sl = programs['sl']
    siti = programs['siti']

    with open('input.json', 'r') as f:
        video_list = json.load(f)

    for name in video_list:
        base_name = f'{name}_{scale}_{fps}'
        folder_in = f'yuv{sl}'

        filepath_in = f'{folder_in}{base_name}.yuv'
        filepath_out = f'{folder_in}{base_name}.log'
        params = (f'-w {w} ' f'-h {h} ' '-f 1 ' '-s ' f'-i {filepath_in}')
        command = f'{siti} {params}'
        print(command)
        with open(filepath_out, 'w') as f:
            subprocess.run(command,
                           stdout=f,
                           stderr=subprocess.STDOUT,
                           encoding='utf-8')
Exemplo n.º 9
0
#!/bin/python3
import itertools
import os
import json
import numpy as np
import matplotlib.pyplot as plt
from utils import util
from utils import util_stats

programs = util.check_system()
sl = programs['sl']

duration = 10
scale = '4320x2160'
w = 4320
h = 2160
fps = 30
gop = 30
qp_list = [20, 25, 30, 35, 40]
rate_list = [2000000, 4000000, 8000000, 16000000, 24000000]
tile_list = ['1x1', '6x4', '12x8']

# videos = {"pac_man": 0,
#           "rollercoaster": 0,
#           "lions": 0,
#           "om_nom": 0}
# videos = {"rollercoaster": 0,
#           "lions": 0,
#           "om_nom": 0}
videos = {"rollercoaster": 0, "lions": 0}
def main():
    programs = util.check_system()
    mp4box = programs['mp4box']
    sl = programs['sl']

    # videos = util.list_videos('input.json')

    videos = {"pac_man": 0, "rollercoaster": 0}
    #"lions": 0,
    #"om_non": 0}

    for name in videos:
        for tile in tile_list:
            m, n = list(map(int, tile.split('x')))
            for rate, qp in list(zip(rate_list, qp_list)):
                for tile_count in range(1, (m * n) + 1):
                    folder = f'{name}_{scale}_{fps}_{tile}'
                    filepath_in_rate = f'hevc{sl}{folder}{sl}{folder}_rate{rate}_tile{tile_count}'
                    filepath_in_qp = f'hevc{sl}{folder}{sl}{folder}_qp{qp}_tile{tile_count}'

                    os.makedirs(f'mp4{sl}{folder}', exist_ok=True)

                    filepath_out_rate = f'mp4{sl}{folder}{sl}{folder}_rate{rate}_tile{tile_count}'
                    filepath_out_qp = f'mp4{sl}{folder}{sl}{folder}_qp{qp}_tile{tile_count}'

                    if os.path.isfile(filepath_out_rate + '.mp4'):
                        print(
                            f'arquivo {filepath_out_rate + ".hevc"} existe. Pulando.'
                        )
                    else:
                        command = f'{mp4box} -add {filepath_in_rate}.hevc:split_tiles -new {filepath_out_rate}.mp4'
                        print(command)
                        with open(filepath_out_rate + '.log',
                                  'w',
                                  encoding='utf-8') as f:
                            subprocess.run(command,
                                           shell=True,
                                           stdout=f,
                                           stderr=subprocess.STDOUT)

                    if os.path.isfile(filepath_out_qp + '.mp4'):
                        print(
                            f'arquivo {filepath_out_qp + ".hevc"} existe. Pulando.'
                        )
                    else:
                        command = f'{mp4box} -add {filepath_in_qp}.hevc:split_tiles -new {filepath_out_qp}.mp4'
                        print(command)
                        with open(filepath_out_qp + '.log',
                                  'w',
                                  encoding='utf-8') as f:
                            subprocess.run(command,
                                           shell=True,
                                           stdout=f,
                                           stderr=subprocess.STDOUT)

                    filepath_in_rate = f'mp4{sl}{folder}{sl}{folder}_rate{rate}_tile{tile_count}'
                    filepath_in_qp = f'mp4{sl}{folder}{sl}{folder}_qp{qp}_tile{tile_count}'

                    os.makedirs(f'mp4{sl}{folder}{sl}rate_dash', exist_ok=True)
                    os.makedirs(f'mp4{sl}{folder}{sl}qp_dash', exist_ok=True)

                    filepath_out_rate = f'mp4{sl}{folder}{sl}rate_dash{sl}{folder}_rate{rate}_tile{tile_count}'
                    filepath_out_qp = f'mp4{sl}{folder}{sl}qp_dash{sl}{folder}_qp{qp}_tile{tile_count}'

                    if os.path.isfile(filepath_out_rate + '.mpd'):
                        print(
                            f'arquivo {filepath_out_rate + ".mpd"} existe. Pulando.'
                        )
                    else:
                        command = f'{mp4box} -dash 1000 -profile live -out {filepath_out_rate}.mpd {filepath_in_rate}.mp4'
                        print(command)
                        with open(filepath_out_rate + '.log',
                                  'w',
                                  encoding='utf-8') as f:
                            subprocess.run(command,
                                           shell=True,
                                           stdout=f,
                                           stderr=subprocess.STDOUT)

                    if os.path.isfile(filepath_out_qp + '.mpd'):
                        print(
                            f'arquivo {filepath_out_qp + ".mpd"} existe. Pulando.'
                        )
                    else:
                        command = f'{mp4box} -dash 1000 -profile live -out {filepath_out_qp}.mpd {filepath_in_qp}.mp4'
                        print(command)
                        with open(filepath_out_qp + '.log',
                                  'w',
                                  encoding='utf-8') as f:
                            subprocess.run(command,
                                           shell=True,
                                           stdout=f,
                                           stderr=subprocess.STDOUT)
Exemplo n.º 11
0
import matplotlib.pyplot as plt

from utils import util

duration = 10
scale = '4320x2160'
w, h = list(map(int, scale.split('x')))
fps = 30
gop = 30
proc_num = 4

qp_list = [20, 30, 40]
rate_list = [2000000, 8000000, 24000000]
tile_list = ['1x1', '2x2', '3x3', '6x3']

sl = util.check_system()['sl']

videos = {'rollercoaster': 0,
          'lions': 0}


def main():
    collect_data()
    # grafico do tamanho do tiles pelo tempo
    graph1()
    graph2()
    # graph3()


def graph1():
    decode_time = _load_data('times.json')
def main():
    programs = util.check_system()
    kvazaar = programs['kvazaar']
    mp4box = programs['mp4box']
    sl = programs['sl']

    # videos = util.list_videos('input.json')

    videos = {"pac_man": 0,
              "rollercoaster": 0,
              "lions": 0,
              "om_nom": 0}

    yuv_folder = 'yuv'
    hevc_base_folder = 'hevc'
    mp4_base_folder = 'mp4'
    dash_folder = 'dash'

    for name in videos:
        for tile in tile_list:
            m, n = list(map(int, tile.split('x')))
            for rate, qp in list(zip(rate_list, qp_list)):
                basename = f'{name}_{scale}_{fps}_{tile}'

                # ----------------------------------------------
                # Encode
                # ----------------------------------------------
                yuv_video_name = f'{yuv_folder}{sl}{name}_{scale}_{fps}'

                hevc_folder = f'{hevc_base_folder}{sl}{basename}'
                hevc_video_qp = f'{hevc_folder}{sl}{basename}_qp{qp}'
                hevc_video_rate = f'{hevc_folder}{sl}{basename}_rate{rate}'

                os.makedirs(f'{hevc_folder}', exist_ok=True)

                params_common = (f'--input {yuv_video_name}.yuv '
                                 f'--input-res {scale} '
                                 f'--input-fps {fps} '
                                 f'-p {gop} '
                                 '--no-tmvp '
                                 '--no-open-gop')
                params_qp = f'{params_common} --qp {qp} --output {hevc_video_qp}.hevc'
                params_rate = f'{params_common} --bitrate {rate} --output {hevc_video_rate}.hevc'

                if tile is not '1x1':
                    tile_params = f' --tiles {tile} --slices tiles --mv-constraint frametilemargin'
                    params_qp += tile_params
                    params_rate += tile_params

                # command = f'{kvazaar} {params_qp}'
                # util.run(command, hevc_video_qp, 'hevc')

                # command = f'{kvazaar} {params_rate}'
                # util.run(command, hevc_video_rate, 'hevc')

                # ----------------------------------------------
                # Encapsule
                # ----------------------------------------------
                mp4_folder = f'{mp4_base_folder}{sl}{basename}'
                mp4_video_qp = f'{mp4_folder}{sl}{basename}_qp{qp}'
                mp4_video_rate = f'{mp4_folder}{sl}{basename}_rate{rate}'

                os.makedirs(f'{mp4_folder}', exist_ok=True)

                # command = f'{mp4box} -add {hevc_video_qp}.hevc:split_tiles -new {mp4_video_qp}.mp4'
                # util.run(command, mp4_video_qp, 'mp4')
                #
                # command = f'{mp4box} -add {hevc_video_rate}.hevc:split_tiles -new {mp4_video_rate}.mp4'
                # util.run(command, mp4_video_rate, 'mp4')

                # # ----------------------------------------------
                # # Extract Tiles
                # # ----------------------------------------------
                for tile_count in range(1, m * n + 1):
                    track = tile_count + 1
                    mp4_tile_video_qp_folder = f'{dash_folder}{sl}{basename}_qp{qp}'
                    mp4_tile_video_rate_folder = f'{dash_folder}{sl}{basename}_rate{rate}'
                    os.makedirs(f'{mp4_tile_video_qp_folder}', exist_ok=True)
                    os.makedirs(f'{mp4_tile_video_rate_folder}', exist_ok=True)

                    mp4_video_tile_qp = f'{mp4_tile_video_qp_folder}{sl}{name}_tile{tile_count}'
                    mp4_video_tile_rate = f'{mp4_tile_video_rate_folder}{sl}{name}_tile{tile_count}'

                    mp4_video_segment_qp_folder = f'{mp4_tile_video_qp_folder}{sl}segments'
                    mp4_video_segment_rate_folder = f'{mp4_tile_video_rate_folder}{sl}segments'
                    os.makedirs(f'{mp4_video_segment_qp_folder}', exist_ok=True)
                    os.makedirs(f'{mp4_video_segment_rate_folder}', exist_ok=True)

                    mp4_video_segment_qp = f'{mp4_video_segment_qp_folder}{sl}{name}_tile{tile_count}_track{track}_001'
                    mp4_video_segment_rate = f'{mp4_video_segment_rate_folder}{sl}{name}_tile{tile_count}_track{track}_001'

                    mp4_video_tile_track_qp = f'{mp4_video_tile_qp}_track{track}'
                    mp4_video_tile_track_rate = f'{mp4_video_tile_rate}_track{track}'

                    # Se tile == 1x1 (pois não tem base track) apenas copiar arquivo para destino
                    if tile in '1x1':
                        # mp4_video_segment_qp = f'{mp4_video_segment_qp_folder}{sl}{name}_tile{tile_count}_001'
                        # mp4_video_segment_rate = f'{mp4_video_segment_rate_folder}{sl}{name}_tile{tile_count}_001'

                        if os.path.isfile(f'{mp4_video_tile_track_qp}.mp4'):
                            print(f'O arquivo {mp4_video_tile_track_qp}.mp4 existe. Pulando.')
                        else:
                            shutil.copyfile(f'{mp4_video_qp}.mp4', f'{mp4_video_tile_track_qp}.mp4')

                        if os.path.isfile(f'{mp4_video_tile_track_rate}.mp4'):
                            print(f'O arquivo {mp4_video_tile_track_rate}.mp4 existe. Pulando.')
                        else:
                            shutil.copyfile(f'{mp4_video_rate}.mp4', f'{mp4_video_tile_track_rate}.mp4')

                        # Segment track
                        command = f'{mp4box} -split 1 {mp4_video_tile_track_qp}.mp4 -out {mp4_video_segment_qp_folder}{sl}'
                        util.run(command, mp4_video_segment_qp, 'mp4', overwrite=False)

                        command = f'{mp4box} -split 1 {mp4_video_tile_track_rate}.mp4 -out {mp4_video_segment_rate_folder}{sl}'
                        util.run(command, mp4_video_segment_rate, 'mp4', overwrite=False)

                    else:
                        # Remove undesired track
                        rem_option = ''
                        for tile_removed in range(2, (m * n) + 2):
                            if tile_removed == track:
                                continue
                            rem_option += f'-rem {tile_removed} '

                        command = f'{mp4box} {rem_option} {mp4_video_qp}.mp4 -out {mp4_video_tile_qp}.mp4'
                        print(command)
                        util.run(command, mp4_video_tile_qp, 'mp4')

                        command = f'{mp4box} {rem_option} {mp4_video_rate}.mp4 -out {mp4_video_tile_rate}.mp4'
                        util.run(command, mp4_video_tile_rate, 'mp4')

                        # Extract track desired (track) only for stats, and track 1, the resulting track.
                        # command = f'{mp4box} -raw {track} -raw 1 {mp4_video_tile_qp}.mp4'
                        command = f'{mp4box} -raw {track} {mp4_video_tile_qp}.mp4'
                        util.run(command, mp4_video_tile_track_qp, 'hvc')

                        # command = f'{mp4box} -raw {track} -raw 1 {mp4_video_tile_rate}.mp4'
                        command = f'{mp4box} -raw {track} {mp4_video_tile_rate}.mp4'
                        util.run(command, mp4_video_tile_track_rate, 'hvc')

                        # Add resulting track in new mp4
                        command = f'{mp4box} -add {mp4_video_tile_track_qp}.hvc -new {mp4_video_tile_track_qp}.mp4'
                        util.run(command, mp4_video_tile_track_qp, 'mp4', overwrite=False)

                        command = f'{mp4box} -add {mp4_video_tile_track_rate}.hvc -new {mp4_video_tile_track_rate}.mp4'
                        util.run(command, mp4_video_tile_track_rate, 'mp4', overwrite=False)

                        # Segment track
                        command = f'{mp4box} -split 1 {mp4_video_tile_track_qp}.mp4 -out {mp4_video_segment_qp_folder}{sl}'
                        util.run(command, f'{mp4_video_segment_qp}', 'mp4')

                        command = f'{mp4box} -split 1 {mp4_video_tile_track_rate}.mp4 -out {mp4_video_segment_rate_folder}{sl}'
                        util.run(command, f'{mp4_video_segment_rate}', 'mp4')
def main():
    programs = util.check_system()
    sl = programs['sl']
    ffmpeg = programs['ffmpeg']
    cp = programs['cp']

    with open('input.json', 'r') as f:
        video_list = json.load(f)

    p_count = 0
    proc = []

    video_list = dict(maldives=0)

    for name in video_list:
        ss = video_list[name]
        folder_in = f'yuv{sl}'
        in_name = f'{name}_{scale}_{fps}'
        filepath_in = f'{folder_in}{in_name}.yuv'

        for tile in tile_list:

            m, n = list(map(int, tile.split('x')))
            tile_w = int(w / m)
            tile_h = int(h / n)

            folder_name = f'{in_name}_{tile}'
            folder_out = f'yuv{sl}{folder_name}'

            os.makedirs(folder_out, exist_ok=True)

            tile_count = 0

            for y in range(0, h, tile_h):
                for x in range(0, w, tile_w):
                    tile_count += 1
                    out_name = f'{folder_name}_tile{tile_count}'
                    filepath_out = f'{folder_out}{sl}{out_name}.yuv'

                    # Encode params
                    input_params = ('-hide_banner -n '
                                    f'-s {scale} '
                                    f'-framerate {fps} '
                                    f'-i {filepath_in}')

                    filter_params = f'-vf "crop=w={tile_w}:h={tile_h}:x={x}:y={y}"'

                    command = f'{ffmpeg} {input_params} {filter_params} {filepath_out}'
                    print('Processando: ' + command)

                    p = subprocess.Popen(command,
                                         shell=True,
                                         stderr=subprocess.DEVNULL)

                    proc.append(p)
                    p_count += 1

                    while p_count >= 1:
                        time.sleep(1)

                        print('.', end='', flush=True)

                        for p in proc:
                            if p.poll() is not None:
                                p_count -= 1
                                proc.remove(p)
                                print('\n\nConcluido:' + p.args + '\n\n')
                                break

    for p in proc:
        p.wait()