Maxon Developers Maxon Developers
    • Documentation
      • Cinema 4D Python API
      • Cinema 4D C++ API
      • Cineware API
      • ZBrush Python API
      • ZBrush GoZ API
      • Code Examples on Github
    • Forum
    • Downloads
    • Support
      • Support Procedures
      • Registered Developer Program
      • Plugin IDs
      • Contact Us
    • Categories
      • Overview
      • News & Information
      • Cinema 4D SDK Support
      • Cineware SDK Support
      • ZBrush 4D SDK Support
      • Bugs
      • General Talk
    • Recent
    • Tags
    • Users
    • Login

    Trigger 'Calculate' frames button [SOLVED]

    Scheduled Pinned Locked Moved PYTHON Development
    6 Posts 0 Posters 587 Views
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • H Offline
      Helper
      last edited by

      On 30/04/2015 at 00:53, xxxxxxxx wrote:

      I'm loading a movie into a shader:

      shader[c4d.BITMAPSHADER_FILENAME] = filepath
      

      ...and I need to trigger the 'Calculate' button so C4D will set the 'Movie Start Frame', and the 'Movie End Frame'.  I don't see an easy way to calculate that myself.  The method I use will have to work on different OS's.

      Also, I've noticed that if I press 'Calculate' with a movie that has a frame rate of 29.97, C4D incorrectly sets the fps to 29.  It doesn't set it correctly, or even attempt to round up to 30.  What's up?

      Thanks,

      Chris

      1 Reply Last reply Reply Quote 0
      • H Offline
        Helper
        last edited by

        On 30/04/2015 at 05:00, xxxxxxxx wrote:

        Hi Chris,

        you can use movie loader Get info to read the informations out of your movie file.
        After this you can set the timing to the shader like we discussed it in this thread:
        Grabbing bitmap data

          
        import c4d, os  
        from c4d import bitmaps  
          
        def BitmapSet(Shader,doc) :  
            
          bitmapPath = Shader[c4d.BITMAPSHADER_FILENAME]  
          
          #if bitmapPath is´nt absolute  
          if not os.path.dirname(bitmapPath) :  
              #the document has´nt been saved already ->picture in user library  
              if not doc.GetDocumentPath() :  
                  abspath= c4d.storage.GeGetStartupWritePath()+"/"+"tex"+"/"+bitmapPath  
              #the picture should be inside the asset´s texture folder      
              else:  
                  abspath= doc.GetDocumentPath()+"/"+"tex"+"/"+bitmapPath  
          
          else:  
              abspath = bitmapPath  
          
          bmp = bitmaps.BaseBitmap()      
          result, ismovie = bmp.InitWith(abspath)  
          if result==c4d.IMAGERESULT_OK:   
              # picture loaded  
              if ismovie==True:   
          
                  ml= bitmaps.MovieLoader()  
                  movie=ml.Open(abspath)  
                  print ml.GetInfo()  
            
          return   
          
          
        def main() :  
          TexTag = op.GetTag(c4d.Ttexture)  
          Mat= TexTag.GetMaterial()  
          Shader=Mat[c4d.MATERIAL_COLOR_SHADER]  
          doc = op.GetDocument()  
          BitmapSet(Shader,doc)  
          
        if __name__=='__main__':  
          main()  
          
        

        Best wishes
        Martin

        1 Reply Last reply Reply Quote 0
        • H Offline
          Helper
          last edited by

          On 30/04/2015 at 05:25, xxxxxxxx wrote:

          You could try to use CallButton()

          1 Reply Last reply Reply Quote 0
          • H Offline
            Helper
            last edited by

            On 30/04/2015 at 07:30, xxxxxxxx wrote:

            Hello,

            as Niklas said you can use CallButton() to trigger a button. In fact, this function was discussed recently on this forum so you find information on that in this threads:

            CallButton: Bitmap Animation - Calculate
            Save Project File in Render Settings

            If a feature of Cinema 4D does not work like expected please use this form to send a bug report. Thanks.

            Best wishes,
            Sebastian

            1 Reply Last reply Reply Quote 0
            • H Offline
              Helper
              last edited by

              On 30/04/2015 at 12:19, xxxxxxxx wrote:

              There is difinately something wrong with the 'Calculate' button regarding fps.  I'll report it.

              Thanks for the 'MovieLoader' method.  I'll use that for now since it will work across platforms.

              Here is function I wrote to get movie info from different sources.
              It lets you switch between 'MovieLoader' and ffprobe.
              ffprobe will give you pretty much anything you want from either the video or audio stream.

              def GetVideoInfo(file_path, movie_loader = True) :
                  from c4d import bitmaps
                  
                  
                  if movie_loader:
                      ml= bitmaps.MovieLoader()
                      movie=ml.Open(file_path)
                      print 'Movie loader', ml.GetInfo()
                      
                      info = ml.GetInfo()
                      frames = info[0]
                      time_base = info[1]
                      duration = frames / float(time_base)
                         
                  else:
                      # This uses 'ffprobe.exe' to get the info.  Set 'gl_file_info_path' to the path for 'ffprobe.exe'
                      
                      # This runs the subprocess without the pop-up console window.
                      startupinfo = subprocess.STARTUPINFO()
                      startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
                      
                      result = subprocess.Popen([gl_file_info_path, file_path, '-print_format', 'json', '-show_streams', '-loglevel', 'quiet'], startupinfo=startupinfo, 
                      stdout = subprocess.PIPE, stderr = subprocess.STDOUT)
                
                      # Everything.
                      #return result.stdout.readlines()
                
                      # Video Stream, audio is 1.
                      #return json.loads(result.stdout.read())['streams'][0]
                      
                      dict = json.loads(result.stdout.read())['streams'][0]
                
                      frames = int(dict['nb_frames'])
                      
                      # Alternate in different format: return int(json.loads(result.stdout.read())['streams'][0]['duration_ts'])
                      duration = float(dict['duration'])
                      
                      # Alternate in different format: values = dict['time_base'].split('/')
                      values = dict['r_frame_rate'].split('/')
                      time_base = float(float(values[0]) / float(values[1]))
                      print 'ffprobe:', frames, time_base
                      
                    
                  return frames, time_base, duration
                      
              

              Thanks everyone,

              Chris

              Here is a list of things you can get from ffprobe:

              {  
              "streams": [  
              {  
              "index": 0,  
              "codec_name": "h264",  
              "codec_long_name": "H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10",  
              "profile": "Main",  
              "codec_type": "video",  
              "codec_time_base": "1/50",  
              "codec_tag_string": "avc1",  
              "codec_tag": "0x31637661",  
              "width": 1280,  
              "height": 720,  
              "has_b_frames": 1,  
              "sample_aspect_ratio": "0:1",  
              "display_aspect_ratio": "0:1",  
              "pix_fmt": "yuv420p",  
              "level": 51,  
              "r_frame_rate": "25/1",  
              "avg_frame_rate": "25/1",  
              "time_base": "1/25",  
              "start_pts": 0,  
              "start_time": "0.000000",  
              "duration_ts": 31453,  
              "duration": "1258.120000",  
              "bit_rate": "441269",  
              "nb_frames": "31453",  
              "disposition": {  
              "default": 0,  
              "dub": 0,  
              "original": 0,  
              "comment": 0,  
              "lyrics": 0,  
              "karaoke": 0,  
              "forced": 0,  
              "hearing_impaired": 0,  
              "visual_impaired": 0,  
              "clean_effects": 0,  
              "attached_pic": 0  
              },  
              "tags": {  
              "creation_time": "2012-03-24 09:25:52",  
              "language": "eng",  
              "handler_name": "Apple Video Media Handler"  
              }  
              },  
              {  
              "index": 1,  
              "codec_name": "aac",  
              "codec_long_name": "AAC (Advanced Audio Coding)",  
              "codec_type": "audio",  
              "codec_time_base": "1/44100",  
              "codec_tag_string": "mp4a",  
              "codec_tag": "0x6134706d",  
              "sample_fmt": "fltp",  
              "sample_rate": "44100",  
              "channels": 2,  
              "bits_per_sample": 0,  
              "r_frame_rate": "0/0",  
              "avg_frame_rate": "0/0",  
              "time_base": "1/44100",  
              "start_pts": 0,  
              "start_time": "0.000000",  
              "duration_ts": 55483392,  
              "duration": "1258.126803",  
              "bit_rate": "127999",  
              "nb_frames": "54183",  
              "disposition": {  
              "default": 0,  
              "dub": 0,  
              "original": 0,  
              "comment": 0,  
              "lyrics": 0,  
              "karaoke": 0,  
              "forced": 0,  
              "hearing_impaired": 0,  
              "visual_impaired": 0,  
              "clean_effects": 0,  
              "attached_pic": 0  
              },  
              "tags": {  
              "creation_time": "2012-03-24 09:25:52",  
              "language": "eng",  
              "handler_name": "Apple Sound Media Handler"  
              }  
              }  
              ],  
              "format": {  
              "filename": "C:\\temp\\TestFile.mp4",  
              "nb_streams": 2,  
              "format_name": "mov,mp4,m4a,3gp,3g2,mj2",  
              "format_long_name": "QuickTime / MOV",  
              "start_time": "0.000000",  
              "duration": "1258.120000",  
              "size": "90237437",  
              "bit_rate": "573792",  
              "tags": {  
              "major_brand": "mp42",  
              "minor_version": "1",  
              "compatible_brands": "mp42mp41",  
              "creation_time": "2012-03-24 09:25:52"  
              }  
              }  
              }
              
              1 Reply Last reply Reply Quote 0
              • H Offline
                Helper
                last edited by

                On 30/04/2015 at 13:56, xxxxxxxx wrote:

                I just got a response from the bug report I sent to Maxon about the 'Calculate' button:
                'Unfortunately this is a known bug that seems to have been around forever.'

                Hmmm.....Then why hasn't it been fixed?

                1 Reply Last reply Reply Quote 0
                • First post
                  Last post