Пример #1
0
    def create_mlt_producer(self, profile):
        width = profile.width()
        height = profile.height()

        surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, width, height)
        cr = cairo.Context(surface)
        cr.set_source_rgb(
            *utils.gdk_color_str_to_cairo_rgb(self.gdk_color_str))
        cr.rectangle(0, 0, width + 1, height + 1)
        cr.fill()

        file_name = md5.new(self.gdk_color_str + str(width) +
                            str(height)).hexdigest()
        write_file_path = utils.get_hidden_user_dir_path(
        ) + appconsts.RENDERED_CLIPS_DIR + "/" + file_name + ".png"
        surface.write_to_png(write_file_path)

        producer = mlt.Producer(profile, write_file_path)
        mltrefhold.hold_ref(producer)
        return producer
Пример #2
0
    def create_mlt_producer(self, profile):
        width = profile.width()
        height = profile.height()

        surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, width, height)
        cr = cairo.Context(surface)
        cr.set_source_rgb(
            *utils.gdk_color_str_to_cairo_rgb(self.gdk_color_str))
        cr.rectangle(0, 0, width + 1, height + 1)
        cr.fill()

        file_name = hashlib.md5((self.gdk_color_str + str(width) +
                                 str(height)).encode('utf-8')).hexdigest()
        write_file_path = userfolders.get_render_dir(
        ) + "/" + file_name + ".png"
        surface.write_to_png(write_file_path)

        producer = mlt.Producer(profile, write_file_path)
        mltrefhold.hold_ref(producer)
        return producer
Пример #3
0
    def create_slowmotion_producer(self, path, speed):
        """
        Creates MLT Producer and adds attributes to it, but does 
        not add it to track/playlist object.
        """
        fr_path = "framebuffer:" + path + "?" + str(speed)
        producer = mlt.Producer(self.profile, None, str(fr_path)) # this runs 0.5s+ on some clips
        mltrefhold.hold_ref(producer)

        (folder, file_name) = os.path.split(path)
        (name, ext) = os.path.splitext(file_name)
        producer.name = name
        producer.path = path
        producer.speed = speed
        producer.media_type = get_media_type(path)
        if producer.media_type == FILE_DOES_NOT_EXIST:
            return None

        self.add_clip_attr(producer)
        
        return producer
Пример #4
0
    def run(self):
        """
        Writes thumbnail image from file producer
        """
        # Create consumer
        matchframe_path = utils.get_hidden_user_dir_path(
        ) + appconsts.TRIM_VIEW_DIR + "/" + self.frame_name
        consumer = mlt.Consumer(PROJECT().profile, "avformat", matchframe_path)
        consumer.set("real_time", 0)
        consumer.set("vcodec", "png")

        # Create one frame producer
        producer = mlt.Producer(PROJECT().profile, str(self.clip_path))
        producer.set("mlt_service", "avformat-novalidate")
        producer = producer.cut(int(self.clip_frame), int(self.clip_frame))

        # Delete match frame
        try:
            os.remove(matchframe_path)
        except:
            # This fails when done first time ever
            pass

        # Save producer and consumer for view needing continues match frame update
        global _producer, _consumer
        if _widget.view != START_TRIM_VIEW and _widget.view != END_TRIM_VIEW:
            _producer = producer
            _consumer = consumer

        # Connect and write image
        consumer.connect(producer)
        consumer.run()

        # Wait until new file exists
        while os.path.isfile(matchframe_path) != True:
            time.sleep(0.1)

        # Do completion callback
        self.completion_callback(self.frame_name)
Пример #5
0
    def create_file_producer_clip(self,
                                  path,
                                  new_clip_name=None,
                                  novalidate=False,
                                  ttl=None):
        """
        Creates MLT Producer and adds attributes to it, but does 
        not add it to track/playlist object.
        """
        #producer = mlt.Producer(self.profile, "avformat-novalidate", str(path)) # this runs 0.5s+ on some clips
        #t = time.monotonic()
        producer = mlt.Producer(self.profile,
                                str(path))  # this runs 0.5s+ on some clips
        #print(time.monotonic() - t)
        #if novalidate == True:
        #    producer.set("mlt_service", "avformat-novalidate")
        mltrefhold.hold_ref(producer)
        producer.path = path
        producer.filters = []

        (dir, file_name) = os.path.split(path)
        (name, ext) = os.path.splitext(file_name)
        producer.name = name
        if new_clip_name != None:
            producer.name = new_clip_name
        producer.media_type = get_media_type(path)

        if producer.media_type == FILE_DOES_NOT_EXIST:
            print("file does not exist")
            return None

        self.add_clip_attr(producer)

        # Img seq ttl value
        producer.ttl = ttl
        if ttl != None:
            producer.set("ttl", int(ttl))

        return producer
Пример #6
0
    def create_file_producer_clip(self, path, new_clip_name=None):
        """
        Creates MLT Producer and adds attributes to it, but does 
        not add it to track/playlist object.
        """
        producer = mlt.Producer(self.profile, str(path)) # this runs 0.5s+ on some clips
        mltrefhold.hold_ref(producer)
        producer.path = path
        producer.filters = []
        
        (dir, file_name) = os.path.split(path)
        (name, ext) = os.path.splitext(file_name)
        producer.name = name
        if new_clip_name != None:
            producer.name = new_clip_name
        producer.media_type = get_media_type(path)
        if producer.media_type == FILE_DOES_NOT_EXIST:
            print "file does not exist"
            return None

        self.add_clip_attr(producer)
        
        return producer
Пример #7
0
 def play_program(self, program=None, resume_offset=0):
     self.still = None
     producer = None
     if program is not None:
         #self.player.video_set_logo_int(vlc.VideoLogoOption.delay, 0)
         #self.player.video_set_logo_string(vlc.VideoLogoOption.file, "stills/screenbug.png")
         self.state = "video"
         # TODO: Fallback if the folder is empty
         media_path = program.get_filename()
         if os.path.exists(media_path):
             producer = mlt.Producer(self.profile, media_path)
             producer.set("force_aspect_ratio", 1.0)
             #producer.set("video_delay", "2.5")
             if program.loop:
                 producer.set("eof", "loop")
             watermarked = self._mlt_watermark(producer)
             self.mlt_consumer.connect(watermarked)
             #self.playing_producer = producer
             # Kill overlays
             #if self.overlay_call:
             #    self.overlay_call.cancel()
             #    self.overlay_call = None
         else:
             logging.error("Didn't find file. Playback never started: %s" %
                           media_path)
     else:
         # Reset & show overlays
         #self._swap_overlay()
         #if not self.playing_consumer:
         watermarked = self._mlt_watermark(self.loop)
         self.mlt_consumer.connect(watermarked)
     # Handle playback and resume offset
     offset = resume_offset
     if program and program.playback_offset:
         offset += program.playback_offset
     if producer and offset:
         producer.seek(int(offset * 25))
Пример #8
0
def create_overlay_screen():
    global profile
    scene = mlt.Producer(profile, "colour:#E53B07")
    f = mlt.Filter(profile, "affine")
    f.set('transition.distort', 1)
    f.set('transitioLD_PRELOAD=n.fill', 1)
    f.set('transition.scale_y', 1)
    if profile.width() == 1920:
        f.set('transition.fix_rotate_x', 0)
        f.set('transition.fix_shear_y', 45)
        f.set(
            'transition.geometry',
            "0=-50%/0%:120%x100%;5=-10%/0:120%x100%;25=-10%/0:120%x100%;30=150%/0%:120%x100%;"
        )
    else:
        f.set('transition.fix_rotate_x', 40)
        f.set('transition.fix_shear_y', 60)
        f.set(
            'transition.geometry',
            "0=-0/-150%:160%x200%;5=0/-70%:160%x200%;25=0/-70%:160%x200%;35=50%/150%:150%x200%;"
        )
    scene.attach(f)
    scene.set('out', 30)
    return scene
Пример #9
0
def _create_noise_producer(profile):
    producer = mlt.Producer(profile, "frei0r.nois0r")
    mltrefhold.hold_ref(producer)
    return producer
Пример #10
0
def _render_reverse_clip_dialog_callback(dialog, response_id, fb_widgets,
                                         media_file):
    if response_id == Gtk.ResponseType.ACCEPT:
        print("_render_reverse_clip_dialog_callback")

        # speed, filename folder
        speed = float(int(fb_widgets.hslider.get_value())) / 100.0
        file_name = fb_widgets.file_name.get_text()
        filenames = fb_widgets.out_folder.get_filenames()
        folder = filenames[0]
        write_file = folder + "/" + file_name + fb_widgets.extension_label.get_text(
        )

        if os.path.exists(write_file):
            primary_txt = _("A File with given path exists!")
            secondary_txt = _(
                "It is not allowed to render Motion Files with same paths as existing files.\nSelect another name for file."
            )
            dialogutils.warning_message(primary_txt, secondary_txt, dialog)
            return

        # Profile
        profile_desc = fb_widgets.categories_combo.get_selected()
        profile = mltprofiles.get_profile(profile_desc)
        profile_desc = profile_desc.replace(" ", "_")

        # Render consumer properties
        encoding_option_index = fb_widgets.encodings_cb.get_active()
        quality_option_index = fb_widgets.quality_cb.get_active()

        # Range
        range_selection = fb_widgets.render_range.get_active()

        dialog.destroy()

        # Create motion producer
        source_path = media_file.path
        if media_file.is_proxy_file == True:
            source_path = media_file.second_file_path

        motion_producer = mlt.Producer(
            profile, None,
            str("timewarp:" + str(speed) + ":" + str(source_path)))

        # start and end frames
        start_frame = 0
        end_frame = motion_producer.get_length() - 1
        render_full_range = True
        if range_selection == 1:
            start_frame = int(
                float(media_file.length - media_file.mark_out - 1) *
                (1.0 / -speed))
            end_frame = int(
                float(media_file.length - media_file.mark_out +
                      (media_file.mark_out - media_file.mark_in) + 1) *
                (1.0 / -speed)) + int(1.0 / -speed)

            if end_frame > motion_producer.get_length() - 1:
                end_frame = motion_producer.get_length() - 1
            if start_frame < 0:
                start_frame = 0

            render_full_range = False  # consumer wont stop automatically and needs to stopped explicitly

        session_id = hashlib.md5(str(
            os.urandom(32)).encode('utf-8')).hexdigest()

        args = ("session_id:" + str(session_id), "speed:" + str(speed),
                "write_file:" + str(write_file),
                "profile_desc:" + str(profile_desc),
                "encoding_option_index:" + str(encoding_option_index),
                "quality_option_index:" + str(quality_option_index),
                "source_path:" + str(source_path), "render_full_range:" +
                str(render_full_range), "start_frame:" + str(start_frame),
                "end_frame:" + str(end_frame))

        job_queue_object = jobs.MotionRenderJobQueueObject(
            session_id, write_file, args)
        job_queue_object.add_to_queue()
    else:
        dialog.destroy()
Пример #11
0
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import mlt
import sys
from PIL import Image

# setup
mlt.Factory.init()
profile = mlt.Profile('square_pal_wide')
prod = mlt.Producer(profile, sys.argv[1])

# This builds a profile from the attributes of the producer: auto-profile.
profile.from_producer(prod)

# Ensure the image is square pixels - optional.
profile.set_width(int(profile.width() * profile.sar()))
profile.set_sample_aspect(1, 0)

# Seek to 10% and get a Mlt frame.
prod.seek(int(prod.get_length() * 0.1))
frame = prod.get_frame()

# And make sure we deinterlace if input is interlaced - optional.
frame.set("consumer_deinterlace", 1)

# Now we are ready to get the image and save it.
size = (profile.width(), profile.height())
rgb = frame.get_image(mlt.mlt_image_rgb24, *size)
img = Image.fromstring('RGB', size, rgb)
img.save(sys.argv[1] + '.png')
Пример #12
0
    def get_thumb_at_frame(self,
                           filename,
                           frame=1,
                           new_name="",
                           full_size=True):
        """ if new_name = None, it will default to  'name_fileext + "_%d.ext' in the thumbnail folder.
		if full_size is True, a full size frame will be extracted (based on the project profile).
		Else: quarter_ntsc"""

        self.file_name = filename

        project_path = self.project.folder
        myPath = self.file_name
        (dirName, fileName) = os.path.split(myPath)
        (fileBaseName, fileExtension) = os.path.splitext(fileName)
        fileExtension = fileExtension.replace(".", "")

        # Init mlt factory
        mlt.Factory.init()

        # set the profile
        if full_size:
            self.profile = profiles.mlt_profiles(self.project).get_profile(
                self.project.project_type)
        else:
            self.profile = mlt.Profile("quarter_ntsc")

        # Create the producer
        self.p = mlt.Producer(self.profile, '%s' % self.file_name)

        # Check if clip is valid (otherwise a seg fault)
        if self.p.is_valid() == False:
            return None

        if new_name == "":
            # just get 1 thumbnail frame
            self.thumbnail_path = project_path + "/thumbnail/" + fileBaseName + "_" + fileExtension + "_%d.png"
        else:
            #for snapshots, use the new file name
            #don't use the thumbnail path for the new file
            self.thumbnail_path = project_path + "/" + new_name

        # create the consumer
        self.c = mlt.Consumer(self.profile, "avformat", self.thumbnail_path)

        # set some consumer properties
        self.c.set("real_time", 0)
        self.c.set("vcodec", "png")

        #get the frame
        self.p = self.p.cut(frame, frame)

        # Check if clip is valid (otherwise a seg fault)
        if self.p.is_valid() == False:
            return None

        # connect the producer and consumer
        self.c.connect(self.p)

        # Only start if the media item has a thumbnail location (i.e. no audio thumbnails)
        if self.thumbnail_path:
            self.c.run()
Пример #13
0
    def GetFile(self,
                file_location,
                only_thumbnail=True,
                new_file_base_name=None,
                start_time=0.00,
                end_time=None):
        """ Use this method to generate an LibreShotFile object based on the URL (or file location)
		of a video or audio file. Each time you call this method, it will lock this thread (and LibreShot's
		main thread) until it has finished. """
        """ 
		file_location: The location of the file on the hard drive, including the name and extension.
		only_thumbnail: True if only a thumbnail should be grabbed from the file, False if image sequence.
		new_file_base_name: The name of the folder and the base for the image sequence name, not including the path.
		start_time: The time to start grabbing frames from the file, in seconds.
		end_time: The time to end grabbing frames from the file, in seconds. None = To the last frame.
		"""

        try:

            # determine name and location of thumbnail image
            self.file_name = file_location
            self.thumbnail_path = ""
            self.file_type = "video"
            self.label = ""
            self.unique_id = str(uuid.uuid1())
            project_path = self.project.folder
            (dirName, fileName) = os.path.split(file_location)
            (fileBaseName, fileExtension) = os.path.splitext(fileName)
            fileExtension = fileExtension.replace(".", "")

            uniqueFileBaseName = self.unique_id
            actual_thumbnail_path = project_path + "/thumbnail/" + uniqueFileBaseName + "_" + fileExtension + "_1.png"

            if only_thumbnail:
                # just get 1 thumbnail frame
                self.thumbnail_path = project_path + "/thumbnail/" + uniqueFileBaseName + "_" + fileExtension + "_%d.png"

                # set the profile
                self.profile = mlt.Profile("quarter_ntsc")

            else:
                if new_file_base_name == None or new_file_base_name == fileBaseName:
                    # choose the same folder as the name (without extension) as default
                    self.thumbnail_path = os.path.join(
                        dirName, fileBaseName, fileBaseName + "_%d.png")
                else:
                    # export a part of the video to a folder under the folder with the same name as the file.
                    self.thumbnail_path = os.path.join(
                        dirName, fileBaseName, new_file_base_name,
                        new_file_base_name + "_%d.png")

            # re-init the mlt factory
            mlt.Factory.init()

            # Create the producer
            self.p = mlt.Producer(self.profile, '%s' % file_location)

            # Check if clip is valid (otherwise a seg fault)
            if self.p.is_valid() == False:
                return None

            # Check for invalid files - badly generated video files can have
            # a length of 0 or -1, e.g.
            # https://bugs.launchpad.net/ubuntu/+source/libreshot/+bug/927755, https://bugs.launchpad.net/kazam/+bug/925238
            if self.p.get_length() < 1 or self.p.get_length() == 0x7fffffff:
                return None

            # check the 'seekable' property
            # If it is zero, then MLT is likely to have problems with this file.
            if self.p.get("seekable") == '0':
                messagebox.show(
                    _("Warning!"),
                    _("The file %s has properties that may prevent it working properly in LibreShot.\nYou may need to transcode it to another format."
                      ) % (self.file_name))

            # create the consumer
            self.c = mlt.Consumer(self.profile, "avformat",
                                  self.thumbnail_path)

            # set some consumer properties
            self.c.set("real_time", 0)
            self.c.set("vcodec", "png")

            # determine length of clip in seconds
            producer_fps = float(self.p.get_fps())
            first_frame = int(round(producer_fps * start_time))
            # Whole clip if end_time = None
            if end_time == None:
                last_frame = self.p.get_length()
            else:
                last_frame = int(round(producer_fps * end_time))
            max_frames = last_frame - first_frame

            # determine dimensions

            height = 0
            width = 0
            if self.p.get("height"):
                height = int(self.p.get("height"))
            if self.p.get("width"):
                width = int(self.p.get("width"))

            audio_index = self.p.get_int("audio_index")
            video_index = self.p.get_int("video_index")
            audio_property = "meta.media.%s.codec.long_name" % audio_index
            if self.p.get(audio_property):
                self.audio_codec = self.p.get(audio_property)
            else:
                self.audio_codec = ""

            video_property = "meta.media.%s.codec.long_name" % video_index
            if self.p.get(video_property):
                self.video_codec = self.p.get(video_property)
            else:
                self.video_codec = ""

            if self.p.get_frame():
                frame = self.p.get_frame()
                self.audio_frequency = frame.get_int("frequency")
                self.audio_channels = frame.get_int("channels")

            # determine if this is an image
            is_image = False
            if self.p.get_length(
            ) == 15000 and video_index == 0 and audio_index == 0:
                # images always have exactly 15000 frames
                is_image = True
                self.file_type = "image"

                # set the max length of the image to 300 seconds (i.e. 5 minutes)
                max_frames = producer_fps * 300

                # get actual height & width of image (since MLT defaults to 1 x 1)
                width, height = self.get_image_size(file_location)

            # determine length
            if only_thumbnail:
                calculate_length = self.p.get_length() / producer_fps
            else:
                calculate_length = max_frames / producer_fps
            if is_image:

                # set the length to 300 seconds (i.e. 5 minutes)
                calculate_length = float(300)

            # set thumbnail image (if no height & width are detected)
            if (height == False or width == False) and (is_image == False):
                self.thumbnail_path = ""
                self.file_type = "audio"

            # get the 1st frame (if not exporting all frames)
            if only_thumbnail:
                max_frames = float(self.p.get_length()) - 1.0
                self.p = self.p.cut(1, 1)
                # get the frames in an interval
            else:
                self.p = self.p.cut(first_frame, last_frame)
                # mark as image seq
                self.label = "Image Sequence"
                self.file_type = "image sequence"

            # Check if clip is valid (otherwise a seg fault)
            if self.p.is_valid() == False:
                return None

            # connect the producer and consumer
            self.c.connect(self.p)

            # Start the consumer, and lock the thread until it's done (to prevent crazy seg fault errors)
            # Only start if the media item has a thumbnail location (i.e. no audio thumbnails)
            if self.thumbnail_path:
                self.c.run()

            # create an libreshot file object
            newFile = files.LibreShotFile(self.project)
            # thumbnails and image sequences are stored at different locations
            if only_thumbnail:
                newFile.name = file_location
            else:
                newFile.name = self.thumbnail_path
            newFile.length = calculate_length
            newFile.thumb_location = actual_thumbnail_path
            newFile.videorate = (self.p.get_fps(), 0)
            newFile.height = height
            newFile.width = width
            newFile.max_frames = max_frames
            newFile.fps = producer_fps
            newFile.file_type = self.file_type
            newFile.label = self.label
            newFile.audio_channels = self.audio_channels
            newFile.audio_codec = self.audio_codec
            newFile.audio_frequency = self.audio_frequency
            newFile.video_codec = self.video_codec

            # return the LibreShotFile object
            return newFile

        except Exception:
            print "Failed to import file: %s" % file_location
Пример #14
0
    def run(self):
        self.start_time = time.monotonic()

        args_vals_list = toolsencoding.get_args_vals_list_for_render_data(
            self.render_data)
        profile = mltprofiles.get_profile_for_index(
            self.render_data.profile_index)

        producer = mlt.Producer(profile, str(self.xml_file_path))

        # Video clip consumer
        if self.render_data.do_video_render == True:
            if self.render_data.save_internally == True:
                file_path = ccrutils.session_folder(
                ) + "/" + appconsts.CONTAINER_CLIP_VIDEO_CLIP_NAME + self.render_data.file_extension
            else:
                file_path = self.render_data.render_dir + "/" + self.render_data.file_name + self.render_data.file_extension

            consumer = renderconsumer.get_mlt_render_consumer(
                file_path, profile, args_vals_list)

            ccrutils.delete_rendered_frames(
            )  # in case we switched from img seq consumer we can now delete those frames to save space
        # img seq consumer
        else:
            # Image sequence gets project profile
            project_profile = mltprofiles.get_profile(self.profile_desc)
            if self.render_data.save_internally == True:
                frame_name = "frame"
            else:
                frame_name = self.render_data.frame_name

            render_path = ccrutils.rendered_frames_folder(
            ) + frame_name + "_%04d." + "png"

            consumer = mlt.Consumer(project_profile, "avformat",
                                    str(render_path))
            consumer.set("real_time", -1)
            consumer.set("rescale", "bicubic")
            consumer.set("vcodec", "png")

        self.render_player = renderconsumer.FileRenderPlayer(
            "", producer, consumer, self.range_in, self.range_out)
        self.render_player.wait_for_producer_end_stop = False
        self.render_player.start()

        while self.render_player.stopped == False:

            self.abort_requested()

            if self.abort == True:
                self.render_player.shutdown()
                return

            fraction = self.render_player.get_render_fraction()
            self.render_update_callback(fraction)

            time.sleep(0.3)

        # Write out completed flag file.
        ccrutils.write_completed_message()
Пример #15
0
    def run(self):
        # FIXME: Is this relevant - doesn't seem to be used in this method?
        self.override_path = None
        self.alternate_progress_bar = None

        # track wheather the thread is playing or not
        self.isPlaying = False

        # track if this thread should die
        self.amAlive = True

        # Start the mlt system
        self.f = mlt.Factory().init()

        # set the MLT profile object... specific in the project properties
        self.profile = profiles.mlt_profiles(self.project).get_profile(
            self.project.project_type)

        # Create the producer
        self.p = mlt.Producer(self.profile, 'xml:%s' % self.file_name)

        if self.p.is_valid():
            # set speed to zero (i.e. pause)
            self.pause()

            # PREVIEW mode
            self.c = mlt.Consumer(
                self.profile,
                str(self.main_form.settings.general["output_mode"]))
            self.c.set("real_time", 1)

            # Connect the producer to the consumer
            self.c.connect(self.p)

            # Start the consumer
            self.c.start()

            # Get the FPS
            self.fps = self.project.fps()

            # init the render percentage
            self.fraction_complete = 0.0

            # Wait until the user stops the consumer
            while self.amAlive:

                # get current frame
                current_frame = float(self.p.position())
                total_frames = float(self.p.get_length() - 1)
                decimal_complete = current_frame / total_frames
                percentage_complete = decimal_complete * 100.0

                # only calculate position / percentage when playing
                if self.c.is_stopped() == False:

                    # move play head
                    new_time = current_frame / float(self.fps)

                    if self.mode == "render":
                        # update Export Dialog Progress Bar
                        self.fraction_complete = decimal_complete
                        if self.project.form.frmExportVideo:
                            gobject.idle_add(
                                self.project.form.frmExportVideo.
                                update_progress, self.fraction_complete)

                    elif self.mode == "preview":

                        if self.alternate_progress_bar:
                            # update alternateive progress bar (if any) of video
                            # this is used by the clip properties window
                            if self.alternate_progress_bar:
                                gobject.idle_add(
                                    self.alternate_progress_bar.set_value,
                                    percentage_complete)

                        else:
                            # update play-head
                            if self.project.sequences[0]:
                                gobject.idle_add(
                                    self.project.sequences[0].move_play_head,
                                    new_time)

                            # update progress bar of video
                            if self.main_form.hsVideoProgress:
                                gobject.idle_add(
                                    self.main_form.hsVideoProgress.set_value,
                                    percentage_complete)
                                gobject.idle_add(
                                    self.main_form.scroll_to_playhead)

                            # pause video when 100%
                            if percentage_complete == 100:
                                self.pause()

                    elif self.mode == "override":
                        # update progress bar of video
                        if self.main_form.hsVideoProgress:
                            gobject.idle_add(
                                self.main_form.hsVideoProgress.set_value,
                                percentage_complete)

                    # wait 1/5 of a second
                    time.sleep(0.1)

                else:
                    if self.mode == "render":
                        # update Export Dialog Progress Bar
                        if self.fraction_complete > 0.0:
                            # update progress bar to 100%
                            if self.project.form.frmExportVideo:
                                gobject.idle_add(
                                    self.project.form.frmExportVideo.
                                    update_progress, 1.0)

                            # reset the fraction
                            self.fraction_complete = 0.0

                    # wait a bit... to cool off the CPU
                    time.sleep(0.1)

            # clear all the MLT objects
            self.consumer_stop()
            self.p = None
            self.c = None
            self.profile = None
            self.f = None

        else:
            # Diagnostics
            print "ERROR WITH %s" % self.file_name
Пример #16
0
 def __init__(self, file_path, callback):
     self.producer = mlt.Producer(_current_profile, str(file_path))
     self.callback = callback
     self.running = True
Пример #17
0
def _render_frame_buffer_clip_dialog_callback(dialog, response_id, fb_widgets,
                                              media_file):
    if response_id == Gtk.ResponseType.ACCEPT:
        # Get data needed for render.
        speed = float(int(fb_widgets.adjustment.get_value())) / 100.0

        file_name = fb_widgets.file_name.get_text()
        filenames = fb_widgets.out_folder.get_filenames()
        folder = filenames[0]
        write_file = folder + "/" + file_name + fb_widgets.extension_label.get_text(
        )

        if os.path.exists(write_file):
            primary_txt = _("A File with given path exists!")
            secondary_txt = _(
                "It is not allowed to render Motion Files with same paths as existing files.\nSelect another name for file."
            )
            dialogutils.warning_message(primary_txt, secondary_txt, dialog)
            return

        profile_index = fb_widgets.out_profile_combo.get_active()
        if profile_index == 0:
            # project_profile is first selection in combo box
            profile = PROJECT().profile
        else:
            profile = mltprofiles.get_profile_for_index(profile_index - 1)
        profile_desc = profile.description().replace(" ", "_")

        encoding_option_index = fb_widgets.encodings_cb.get_active()
        quality_option_index = fb_widgets.quality_cb.get_active()

        range_selection = fb_widgets.render_range.get_active()

        dialog.destroy()

        source_path = media_file.path
        if media_file.is_proxy_file == True:
            source_path = media_file.second_file_path

        # start and end frames
        motion_producer = mlt.Producer(
            profile, None,
            str("timewarp:" + str(speed) + ":" + str(source_path)))
        start_frame = 0
        end_frame = motion_producer.get_length() - 1
        render_full_range = True  # REMOVE THIS DONW THE LINE, NOT USED.
        if range_selection == 1:
            start_frame = int(float(media_file.mark_in) * (1.0 / speed))
            end_frame = int(float(media_file.mark_out + 1) *
                            (1.0 / speed)) + int(1.0 / speed)

            if end_frame > motion_producer.get_length() - 1:
                end_frame = motion_producer.get_length() - 1

            render_full_range = False  # consumer wont stop automatically and needs to stopped explicitly

        session_id = hashlib.md5(str(
            os.urandom(32)).encode('utf-8')).hexdigest()

        args = ("session_id:" + str(session_id), "speed:" + str(speed),
                "write_file:" + str(write_file).replace(" ", "\ "),
                "profile_desc:" + str(profile_desc),
                "encoding_option_index:" + str(encoding_option_index),
                "quality_option_index:" + str(quality_option_index),
                "source_path:" + str(source_path).replace(" ", "\ "),
                "render_full_range:" + str(render_full_range), "start_frame:" +
                str(start_frame), "end_frame:" + str(end_frame))

        job_queue_object = jobs.MotionRenderJobQueueObject(
            session_id, write_file, args)
        job_queue_object.add_to_queue()

    else:
        dialog.destroy()
Пример #18
0
def get_clip_profile_index(clip_path):
    profile = mltprofiles.get_default_profile()
    producer = mlt.Producer(profile, str(clip_path))
    profile_index = mltprofiles.get_closest_matching_profile_index(utils.get_file_producer_info(producer))
    return profile_index
Пример #19
0
import tempfile
import os
import os.path

# Start the mlt system
mlt.mlt_log_set_level(40) # verbose
mlt.Factory.init()

# Establish a pipeline
profile = mlt.Profile("atsc_1080i_5994")
#profile = mlt.Profile('square_ntsc_wide')
profile.set_explicit(1)
tractor = mlt.Tractor()
tractor.set('eof', 'loop')
playlist = mlt.Playlist()
playlist.append(mlt.Producer(profile, 'color:'))

# Setup the consumer
consumer = 'decklink:0'
if len(sys.argv) > 1:
  consumer = sys.argv[1]
consumer = mlt.Consumer(profile, consumer)
consumer.connect(playlist)
#consumer.set("real_time", -2)
consumer.start()

def switch(resource):
  global playlist
  resource = resource
  playlist.lock()
  playlist.append(mlt.Producer(profile, str(resource)))
Пример #20
0
def _render_reverse_clip_dialog_callback(dialog, response_id, fb_widgets, media_file):
    if response_id == Gtk.ResponseType.ACCEPT:
        # speed, filename folder
        speed = float(int(fb_widgets.hslider.get_value())) / 100.0
        file_name = fb_widgets.file_name.get_text()
        filenames = fb_widgets.out_folder.get_filenames()
        folder = filenames[0]
        write_file = folder + "/"+ file_name + fb_widgets.extension_label.get_text()

        if os.path.exists(write_file):
            primary_txt = _("A File with given path exists!")
            secondary_txt = _("It is not allowed to render Motion Files with same paths as existing files.\nSelect another name for file.") 
            dialogutils.warning_message(primary_txt, secondary_txt, dialog)
            return

         # Profile
        profile_index = fb_widgets.out_profile_combo.get_active()
        if profile_index == 0:
            # project_profile is first selection in combo box
            profile = PROJECT().profile
        else:
            profile = mltprofiles.get_profile_for_index(profile_index - 1)

        # Render consumer properties
        encoding_option_index = fb_widgets.encodings_cb.get_active()
        quality_option_index = fb_widgets.quality_cb.get_active()

        # Range
        range_selection = fb_widgets.render_range.get_active()
        
        dialog.destroy()

        # Create motion producer
        source_path = media_file.path
        if media_file.is_proxy_file == True:
            source_path = media_file.second_file_path

        motion_producer = mlt.Producer(profile, None, str("timewarp:" + str(speed) + ":" + str(source_path)))
        mltrefhold.hold_ref(motion_producer)
        
        # Create sequence and add motion producer into it
        seq = sequence.Sequence(profile)
        seq.create_default_tracks()
        track = seq.tracks[seq.first_video_index]
        track.append(motion_producer, 0, motion_producer.get_length() - 1)

        print "motion clip render starting..."

        consumer = renderconsumer.get_render_consumer_for_encoding_and_quality(write_file, profile, encoding_option_index, quality_option_index)
        
        # start and end frames
        start_frame = 0
        end_frame = motion_producer.get_length() - 1
        wait_for_producer_stop = True
        if range_selection == 1:
            start_frame = int(float(media_file.length - media_file.mark_out - 1) * (1.0 / -speed))
            end_frame = int(float(media_file.length - media_file.mark_out + (media_file.mark_out - media_file.mark_in) + 1) * (1.0 / -speed)) + int(1.0 / -speed)

            if end_frame > motion_producer.get_length() - 1:
                end_frame = motion_producer.get_length() - 1
            if start_frame < 0:
                start_frame = 0
            
            wait_for_producer_stop = False # consumer wont stop automatically and needs to stopped explicitly

        # Launch render
        global motion_renderer, motion_progress_update
        motion_renderer = renderconsumer.FileRenderPlayer(write_file, seq.tractor, consumer, start_frame, end_frame)
        motion_renderer.wait_for_producer_end_stop = wait_for_producer_stop
        motion_renderer.start()

        title = _("Rendering Reverse Clip")
        text = "<b>Motion Clip File: </b>" + write_file
        progress_bar = Gtk.ProgressBar()
        dialog = rendergui.clip_render_progress_dialog(_FB_render_stop, title, text, progress_bar, gui.editor_window.window)

        motion_progress_update = renderconsumer.ProgressWindowThread(dialog, progress_bar, motion_renderer, _REVERSE_render_stop)
        motion_progress_update.start()

    else:
        dialog.destroy()
Пример #21
0
    def run(self):
        self.start_time = time.monotonic()

        if self.render_data.save_internally == True:
            frame_name = "frame"
        else:
            frame_name = self.render_data.frame_name

        rendered_frames_folder = ccrutils.rendered_frames_folder()

        # Delete old rendered frames
        for frame_file in os.listdir(rendered_frames_folder):
            file_path = os.path.join(rendered_frames_folder, frame_file)
            os.remove(file_path)

        if self.abort == True:
            return

        script_file = open(self.script_path)
        user_script = script_file.read()

        profile_file_path = mltprofiles.get_profile_file_path(
            self.profile_desc)

        editors_data_json = json.dumps(
            self.fluxity_plugin_edit_data["editors_list"]
        )  # See fluxity.FluxityContext.get_script_data()

        fluxity.render_frame_sequence(user_script, self.range_in,
                                      self.range_out, rendered_frames_folder,
                                      profile_file_path, self.frames_update,
                                      editors_data_json, True)

        render_length = self.range_out - self.range_in
        while len(os.listdir(rendered_frames_folder)) != render_length:
            if self.abort == True:
                return
            time.sleep(0.5)

        # Render video
        if self.render_data.do_video_render == True:
            # Render consumer
            args_vals_list = toolsencoding.get_args_vals_list_for_render_data(
                self.render_data)
            profile = mltprofiles.get_profile_for_index(
                self.render_data.profile_index)

            if self.render_data.save_internally == True:
                file_path = ccrutils.session_folder(
                ) + "/" + appconsts.CONTAINER_CLIP_VIDEO_CLIP_NAME + self.render_data.file_extension
            else:
                file_path = self.render_data.render_dir + "/" + self.render_data.file_name + self.render_data.file_extension

            consumer = renderconsumer.get_mlt_render_consumer(
                file_path, profile, args_vals_list)

            # Render producer
            num_part = str(1).zfill(5)

            frame_file = rendered_frames_folder + "/" + frame_name + "_" + num_part + ".png"
            resource_name_str = utils.get_img_seq_resource_name(
                frame_file, True)

            resource_path = rendered_frames_folder + "/" + resource_name_str
            producer = mlt.Producer(profile, str(resource_path))

            frames_length = len(os.listdir(rendered_frames_folder))

            self.render_player = renderconsumer.FileRenderPlayer(
                "", producer, consumer, 0, frames_length - 1)
            self.render_player.wait_for_producer_end_stop = False
            self.render_player.start()

            while self.render_player.stopped == False:
                self.abort_requested()

                if self.abort == True:
                    self.render_player.shutdown()
                    return

                fraction = self.render_player.get_render_fraction()
                self.video_render_update_callback(fraction)

                time.sleep(0.3)

            ccrutils.delete_rendered_frames()

        # Write out completed flag file.
        ccrutils.write_completed_message()
Пример #22
0
def main(root_path, session_id, project_path, range_in, range_out,
         profile_desc):

    project_path = utils.escape_shell_path(project_path)

    try:
        editorstate.mlt_version = mlt.LIBMLT_VERSION
    except:
        editorstate.mlt_version = "0.0.99"  # magic string for "not found"

    # Set paths.
    respaths.set_paths(root_path)

    userfolders.init()
    editorpersistance.load()

    # Init translations module with translations data
    translations.init_languages()
    translations.load_filters_translations()
    mlttransitions.init_module()

    repo = mlt.Factory().init()
    processutils.prepare_mlt_repo(repo)

    # Set numeric locale to use "." as radix, MLT initilizes this to OS locale and this causes bugs
    locale.setlocale(locale.LC_NUMERIC, 'C')

    # Check for codecs and formats on the system
    mltenv.check_available_features(repo)
    renderconsumer.load_render_profiles()

    # Load filter and compositor descriptions from xml files.
    mltfilters.load_filters_xml(mltenv.services)
    mlttransitions.load_compositors_xml(mltenv.transitions)

    # Create list of available mlt profiles
    mltprofiles.load_profile_list()

    ccrutils.init_session_folders(session_id)
    ccrutils.load_render_data()

    log_path = GLib.get_user_cache_dir() + "/blenderrenderlog"
    FLOG = open(log_path, 'w')

    render_setup_script = respaths.ROOT_PATH + "/tools/blenderrendersetup.py"
    blender_launch = "/usr/bin/blender -b " + project_path + " -P " + utils.escape_shell_path(
        render_setup_script)

    global _start_time
    _start_time = time.monotonic()

    render_data = ccrutils.get_render_data()

    # Delete old rendered frames for non-preview renders.
    if render_data.is_preview_render == False:
        rendered_frames_folder = ccrutils.rendered_frames_folder()
        for frame_file in os.listdir(rendered_frames_folder):
            file_path = os.path.join(rendered_frames_folder, frame_file)
            os.remove(file_path)
    else:
        # For preview render delete preview frames
        preview_frames_folder = ccrutils.preview_frames_folder()
        for frame_file in os.listdir(preview_frames_folder):
            file_path = os.path.join(preview_frames_folder, frame_file)
            os.remove(file_path)

    p = subprocess.Popen(blender_launch,
                         shell=True,
                         stdin=FLOG,
                         stdout=FLOG,
                         stderr=FLOG,
                         preexec_fn=os.setsid)

    manager_thread = ProgressPollingThread(range_in, range_out, p,
                                           render_data.is_preview_render)
    manager_thread.start()

    p.wait()

    if manager_thread.abort == True:
        return

    # Render video
    if render_data.do_video_render == True:

        # Change file numbering to start from 0000 to please ffmpeg
        rendered_folder = ccrutils.rendered_frames_folder() + "/"

        files = [
            f for f in listdir(rendered_folder)
            if isfile(join(rendered_folder, f))
        ]
        files.sort(key=lambda var: [
            int(x) if x.isdigit() else x
            for x in re.findall(r'[^0-9]|[0-9]+', var)
        ])

        number = 0
        for rendered_file in files:
            source_file = rendered_folder + rendered_file

            file_number = '{0:04d}'.format(number)
            dst_file = rendered_folder + "videoframe" + file_number + ".png"
            Path(source_file).rename(dst_file)

            number += 1

        # Render consumer
        args_vals_list = toolsencoding.get_args_vals_list_for_render_data(
            render_data)
        profile = mltprofiles.get_profile_for_index(render_data.profile_index)

        if ccrutils.get_render_data().save_internally == True:
            file_path = ccrutils.session_folder(
            ) + "/" + appconsts.CONTAINER_CLIP_VIDEO_CLIP_NAME + render_data.file_extension
        else:
            file_path = render_data.render_dir + "/" + render_data.file_name + render_data.file_extension

        consumer = renderconsumer.get_mlt_render_consumer(
            file_path, profile, args_vals_list)

        # Render producer
        rendered_frames_folder = ccrutils.rendered_frames_folder()

        frames_info = gmicplayer.FolderFramesInfo(rendered_frames_folder)
        frame_file = frames_info.get_lowest_numbered_file()

        if editorstate.mlt_version_is_equal_or_greater("0.8.5"):
            resource_name_str = utils.get_img_seq_resource_name(
                frame_file, True)
        else:
            resource_name_str = utils.get_img_seq_resource_name(
                frame_file, False)
        resource_path = rendered_frames_folder + "/" + resource_name_str
        producer = mlt.Producer(profile, str(resource_path))

        frames_length = len(os.listdir(rendered_frames_folder))

        render_player = renderconsumer.FileRenderPlayer(
            "", producer, consumer, 0, frames_length - 1)
        render_player.wait_for_producer_end_stop = False
        render_player.start()

        abort = False
        while render_player.stopped == False and abort == False:

            abort = ccrutils.abort_requested()
            if abort == True:
                render_player.shutdown()
                return
            else:
                fraction = render_player.get_render_fraction()
                elapsed = time.monotonic() - _start_time
                msg = "2 " + str(fraction) + " " + str(elapsed)
                ccrutils.write_status_message(msg)

            time.sleep(1.0)

    else:
        manager_thread.abort = True  # to exit while loop and end thread

    ccrutils.write_completed_message()

    print("Blender render complete.")
Пример #23
0
 def create_mlt_producer(self, profile):
     producer = mlt.Producer(profile, "frei0r.nois0r")
     mltrefhold.hold_ref(producer)
     return producer
Пример #24
0
    def load_xml(self):

        # get reference to translate gettext method
        _ = self._

        # re-init the mlt factory
        mlt.Factory.init()

        # Create the consumer
        if self.mode == "render":
            # RENDER MOVIE mode

            # stop the consumer
            self.consumer_stop()

            # Create the producer
            self.p = mlt.Producer(self.profile, 'xml:%s' % self.file_name)
            if self.p.is_valid() == False:
                print "ERROR WITH %s" % self.file_name
                return

            # get export file path
            folder = self.render_options["folder"]
            file = self.render_options["file"]
            format = self.render_options["f"]
            export_path = "%s.%s" % (os.path.join(folder, file), format)

            # create consumer
            self.c = mlt.Consumer(self.profile, "avformat", export_path)

            # set some RENDER specific options
            self.c.set("real_time", -1)

            # set render options
            if self.render_options["export_to"] == _("Image Sequence"):
                # image seq
                self.c.set("vcodec", self.render_options["vcodec"])
            else:
                # video & audio
                self.c.set("f", format)
                self.c.set("vcodec", self.render_options["vcodec"])
                self.c.set("b", self.render_options["b"])
                self.c.set("acodec", self.render_options["acodec"])
                self.c.set("ar", self.render_options["ar"])
                self.c.set("ac", self.render_options["ac"])
                self.c.set("ab", self.render_options["ab"])

                if self.render_options["vcodec"] == "libx264":
                    self.c.set("minrate", "0")
                    self.c.set("b_strategy", "1")
                    self.c.set("subcmp", "2")
                    self.c.set("cmp", "2")
                    self.c.set("coder", "1")
                    self.c.set("flags", "+loop")
                    self.c.set("flags2", "dct8x8")
                    self.c.set("qmax", "51")
                    self.c.set("subq", "7")
                    self.c.set("qmin", "10")
                    self.c.set("qcomp", locale.str(float("0.6")))
                    self.c.set("qdiff", "4")
                    self.c.set("trellis", "1")
                if format == "dvd":
                    # stolen from ffmpeg.c, void opt_target(const char *arg)
                    self.c.set("maxrate", "9000000")
                    self.c.set("minrate", "0")
                    self.c.set("bufsize", "1835008")
                    self.c.set("packetsize", "2048")
                    self.c.set("muxrate", "10080000")

        else:
            # stop the consumer (if sdl_preview mode and an older version of MLT)
            if self.check_version(0, 6, 0) == False and str(
                    self.main_form.settings.general["output_mode"]
            ) == "sdl_preview":
                # stop the consumer
                self.consumer_stop()

            # Create the producer
            self.p = mlt.Producer(self.profile, 'xml:%s' % self.file_name)
            if self.p.is_valid() == False:
                print "ERROR WITH %s" % self.file_name
                return

            # refresh sdl and pause video
            self.pause()

        # connect the producer and consumer
        self.c.connect(self.p)

        # start consumer
        if self.c.is_stopped:
            self.c.start()
Пример #25
0
 def create_mlt_producer(self, profile):
     producer = mlt.Producer(profile,
                             respaths.PATTERN_PRODUCER_PATH + "ebubars.png")
     mltrefhold.hold_ref(producer)
     return producer
Пример #26
0
 def __init__(self, clip_path):
     self.producer = mlt.Producer(_current_profile, str(clip_path))
     self.producer.mark_in = -1
     self.producer.mark_out = -1
Пример #27
0
    def run(self):
        items = 1
        global progress_window
        start = time.time()
        elapsed = 0
        proxy_w, proxy_h = _get_proxy_dimensions(
            self.proxy_profile,
            editorstate.PROJECT().proxy_data.size)
        proxy_encoding = _get_proxy_encoding()
        self.current_render_file_path = None

        print "proxy render started, items: " + str(len(
            self.files_to_render)) + ", dim: " + str(proxy_w) + "x" + str(
                proxy_h)

        for media_file in self.files_to_render:
            if self.aborted == True:
                break

            if media_file.type == appconsts.IMAGE_SEQUENCE:
                self._create_img_seq_proxy(media_file, proxy_w, proxy_h, items,
                                           start)
                continue

            # Create render objects
            proxy_file_path = media_file.create_proxy_path(
                proxy_w, proxy_h, proxy_encoding.extension)
            self.current_render_file_path = proxy_file_path
            renderconsumer.performance_settings_enabled = False
            consumer = renderconsumer.get_render_consumer_for_encoding(
                proxy_file_path, self.proxy_profile, proxy_encoding)
            renderconsumer.performance_settings_enabled = True
            # Bit rates for proxy files are counted using 2500kbs for
            # PAL size image as starting point.
            pal_pix_count = 720.0 * 576.0
            pal_proxy_rate = 2500.0
            proxy_pix_count = float(proxy_w * proxy_h)
            proxy_rate = pal_proxy_rate * (proxy_pix_count / pal_pix_count)
            proxy_rate = int(
                proxy_rate / 100) * 100  # Make proxy rate even hundred
            # There are no practical reasons to have bitrates lower than 500kbs.
            if proxy_rate < 500:
                proxy_rate = 500
            consumer.set("vb", str(int(proxy_rate)) + "k")

            consumer.set("rescale", "nearest")

            file_producer = mlt.Producer(self.proxy_profile,
                                         str(media_file.path))
            mltrefhold.hold_ref(
                file_producer
            )  # this may or may not be needed to avoid crashes
            stop_frame = file_producer.get_length() - 1

            # Create and launch render thread
            global render_thread
            render_thread = renderconsumer.FileRenderPlayer(
                None, file_producer, consumer, 0, stop_frame)
            render_thread.start()

            # Render view update loop
            self.thread_running = True
            self.aborted = False
            while self.thread_running:
                if self.aborted == True:
                    break
                render_fraction = render_thread.get_render_fraction()
                now = time.time()
                elapsed = now - start
                Gdk.threads_enter()
                progress_window.update_render_progress(
                    render_fraction, media_file.name, items,
                    len(self.files_to_render), elapsed)
                Gdk.threads_leave()
                render_thread.producer.get_length()
                if render_thread.producer.frame() >= stop_frame:
                    self.thread_running = False
                    media_file.add_proxy_file(proxy_file_path)
                    if self.set_as_proxy_immediately:  # When proxy mode is USE_PROXY_MEDIA all proxy files are used all the time
                        media_file.set_as_proxy_media_file()
                    self.current_render_file_path = None
                else:
                    time.sleep(0.1)

            if not self.aborted:
                items = items + 1
                Gdk.threads_enter()
                progress_window.update_render_progress(
                    0, media_file.name, items, len(self.files_to_render),
                    elapsed)
                Gdk.threads_leave()
            else:
                print "proxy render aborted"
                render_thread.shutdown()
                break

            render_thread.shutdown()

        Gdk.threads_enter()
        _proxy_render_stopped()
        Gdk.threads_leave()

        # Remove unfinished proxy files
        if self.current_render_file_path != None:
            os.remove(self.current_render_file_path)
        # If we're currently proxy editing, we need to update
        # all the clips on the timeline to use proxy media.
        if editorstate.PROJECT(
        ).proxy_data.proxy_mode == appconsts.USE_PROXY_MEDIA:
            _auto_re_convert_after_proxy_render_in_proxy_mode()

        print "proxy render done"
Пример #28
0
    def run(self):
        editorpersistance.load(
        )  # to apply possible chnages on timeline rendering

        start_time = time.monotonic()

        width, height = _get_render_dimensions(
            self.profile, editorpersistance.prefs.tline_render_size)
        encoding = _get_render_encoding()
        self.render_profile = _get_render_profile(
            self.profile, editorpersistance.prefs.tline_render_size,
            self.render_folder)

        self.current_render_file_path = None

        sequence_xml_producer = mlt.Producer(self.profile,
                                             str(self.sequence_xml_path))

        for segment in self.segments:
            if self.aborted == True:
                break

            clip_file_path, clip_range_in, clip_range_out = segment

            # Create render objects
            self.current_render_file_path = clip_file_path
            renderconsumer.performance_settings_enabled = False

            consumer = renderconsumer.get_render_consumer_for_encoding(
                clip_file_path, self.render_profile, encoding)
            renderconsumer.performance_settings_enabled = True

            # We are using proxy file rendering code here mostly, didn't vhange all names.
            # Bit rates for proxy files are counted using 2500kbs for
            # PAL size image as starting point.
            pal_pix_count = 720.0 * 576.0
            pal_proxy_rate = 2500.0
            proxy_pix_count = float(width * height)
            proxy_rate = pal_proxy_rate * (proxy_pix_count / pal_pix_count)
            proxy_rate = int(
                proxy_rate / 100) * 100  # Make proxy rate even hundred
            # There are no practical reasons to have bitrates lower than 500kbs.
            if proxy_rate < 500:
                proxy_rate = 500
            consumer.set("vb", str(int(proxy_rate)) + "k")

            consumer.set("rescale", "nearest")

            start_frame = clip_range_in

            stop_frame = clip_range_out + RENDERING_PAD_FRAMES
            if stop_frame > sequence_xml_producer.get_length() - 1:
                stop_frame = sequence_xml_producer.get_length() - 1

            # Create and launch render thread
            self.render_thread = renderconsumer.FileRenderPlayer(
                None, sequence_xml_producer, consumer, start_frame, stop_frame)
            self.render_thread.wait_for_producer_end_stop = False
            self.render_thread.start()

            # Render view update loop
            self.render_in_progress = True
            self.aborted = False
            while self.render_in_progress:
                if self.aborted == True:
                    break

                if self.render_thread.running == False:  # Rendering has reached end
                    self.render_in_progress = False
                    self.current_render_file_path = None
                else:
                    time.sleep(0.1)

            if self.aborted:
                self.render_thread.shutdown()
                break

            self.completed_segments.append(clip_file_path)

            self.render_thread.shutdown()

        self.render_complete = True
        print("tline render done, time:", time.monotonic() - start_time)
Пример #29
0
    def run(self):
        self.start_time = time.monotonic()

        self.render_player = None
        self.frames_range_writer = None

        self.script_renderer = None

        if self.render_data.save_internally == True:
            frame_name = "frame"
        else:
            frame_name = self.render_data.frame_name

        clip_frames_folder = ccrutils.clip_frames_folder()
        rendered_frames_folder = ccrutils.rendered_frames_folder()

        profile = mltprofiles.get_profile(self.profile_desc)

        # Delete old clip frames
        for frame_file in os.listdir(clip_frames_folder):
            file_path = os.path.join(clip_frames_folder, frame_file)
            os.remove(file_path)

        # Delete old rendered frames
        for frame_file in os.listdir(rendered_frames_folder):
            file_path = os.path.join(rendered_frames_folder, frame_file)
            os.remove(file_path)

        self.frames_range_writer = gmicplayer.FramesRangeWriter(
            self.clip_path, self.frames_update, profile)
        self.frames_range_writer.write_frames(clip_frames_folder + "/",
                                              frame_name, self.range_in,
                                              self.range_out)

        if self.abort == True:
            return

        script_file = open(self.script_path)
        user_script = script_file.read()

        while len(os.listdir(clip_frames_folder)) != self.length:
            time.sleep(0.5)

        # Render frames with gmic script
        self.script_renderer = gmicplayer.FolderFramesScriptRenderer(
            user_script,
            clip_frames_folder,
            rendered_frames_folder + "/",
            frame_name,
            self.script_render_update_callback,
            self.script_render_output_callback,
            10,
            False,  # this is not useful until we get MLT to fin frames sequences not startin from 0001
            0)
        self.script_renderer.write_frames()

        ccrutils.delete_clip_frames()

        if self.abort == True:
            return

        # Render video
        if self.render_data.do_video_render == True:
            # Render consumer
            args_vals_list = toolsencoding.get_args_vals_list_for_render_data(
                self.render_data)
            profile = mltprofiles.get_profile_for_index(
                self.render_data.profile_index)

            if self.render_data.save_internally == True:
                file_path = ccrutils.session_folder(
                ) + "/" + appconsts.CONTAINER_CLIP_VIDEO_CLIP_NAME + self.render_data.file_extension
            else:
                file_path = self.render_data.render_dir + "/" + self.render_data.file_name + self.render_data.file_extension

            consumer = renderconsumer.get_mlt_render_consumer(
                file_path, profile, args_vals_list)

            # Render producer
            frame_file = rendered_frames_folder + "/" + frame_name + "_0000.png"
            resource_name_str = utils.get_img_seq_resource_name(
                frame_file, True)

            resource_path = rendered_frames_folder + "/" + resource_name_str
            producer = mlt.Producer(profile, str(resource_path))

            frames_length = len(os.listdir(rendered_frames_folder))

            self.render_player = renderconsumer.FileRenderPlayer(
                "", producer, consumer, 0, frames_length - 1)
            self.render_player.wait_for_producer_end_stop = False
            self.render_player.start()

            while self.render_player.stopped == False:

                self.abort_requested()

                if self.abort == True:
                    self.render_player.shutdown()
                    return

                fraction = self.render_player.get_render_fraction()
                self.video_render_update_callback(fraction)

                time.sleep(0.3)

            ccrutils.delete_rendered_frames()

        # Write out completed flag file.
        ccrutils.write_completed_message()
Пример #30
0
# Start the mlt system
mlt.mlt_log_set_level(40)  # verbose
mlt.Factory.init()

# Establish a pipeline
profile = mlt.Profile("atsc_1080i_5994")
profile.set_explicit(1)
tractor = mlt.Tractor()
tractor.set("eof", "loop")
fg_resource = "decklink:0"
bg_resource = "decklink:1"
if len(sys.argv) > 2:
    fg_resource = sys.argv[1]
    bg_resource = sys.argv[2]
fg = mlt.Producer(profile, fg_resource)
bg = mlt.Producer(profile, bg_resource)
tractor.set_track(bg, 0)
tractor.set_track(fg, 1)
composite = mlt.Transition(profile, "composite")
composite.set("fill", 1)
tractor.plant_transition(composite)

# Setup the consumer
consumer = "decklink:2"
if len(sys.argv) > 3:
    consumer = sys.argv[3]
consumer = mlt.Consumer(profile, consumer)
consumer.connect(tractor)
consumer.set("real_time", -2)
consumer.start()