Trigger 'Calculate' frames button [SOLVED]

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

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

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

You could try to use CallButton()

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

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"  
}  
}  
}

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?