I’m using Davinci Resolve for creating the video component of the compilation. I’m new to the software, and there’s a lot here, so I’m still learning the very basics of it. So far I know how to chop up clips and move them around. I know how to find the source timecode for the start of all my clips which I’ll need for finding it in the script. However I’m having a very hard time figuring out how to find the source timecode for the end of the clip. In the edit section there’s an Inspector tab, and under “file” it shows the metadata. At the top of Metadata it just says “timecode,” but sometimes it shows the timecode for the beginning of the clip and sometimes it shows the timecode for the end of the clip. It’s also not obvious to me which one of those it’s showing me. I’m just doing a simple test with five clips, all from the same video, and it’s already driving me nuts.
The next tricky part is now making one script from many pieces. I’ve used OFS for creating scripts from scratch, but I’ve never used it for this purpose. I’ve opened OFS, and I’m already lost on how to proceed. I don’t even know how to get to an exact timecode in the script because I can’t figure out how to type in the numbers. When I do manage to figure out how to get to the exact timecodes of the beginning and end of my clip, how do I cut out that section of the script and paste it into a new one?
Here is where the timestamp information is located in OFS:
The format is HH:MM:SS.000. Here’s a thing that confused me at first, and you may be experiencing. Different tools treat the “.000” in a different way. Most of them treat that as milliseconds. However, some tools (like the default settings in VSDC) actually treat that as frames inside that second. So you will need to keep an eye out for that.
There is a tool that could really help with what you’re trying to do. It can be used to split up and then merge video AND their associated funscripts at the same time. It was made by @overkeks, and it can be found in this topic: Funscript&Video merger / splitter - Software - EroScripts. I’ve used it many times, and I highly suggest it. One thing to note with this tool: it uses the .csv format. If you’re not careful (like I wasn’t), you will get frustrated because your spreadsheet software might not use semicolons as delimiters by default. The .csv MUST use semicolons. Let me know if you need more explanation or examples.
One final note if you’re using the fsVideoMergerSplitter tool. You will need to input the timestamp as a number in milliseconds, not a timestamp. For example, a timestamp of 2 hours, 35 minutes, 49 seconds, and 578 milliseconds (02:35:49.578) would end up being 9,349,578 ms.
There are 3,600,000 milliseconds in 1 hour. (1000 ms/sec * 60 secs/min * 60 mins/hr)
There are 60,000 milliseconds in 1 minute. (1000 ms/sec * 60 secs/min)
There are 1,000 milliseconds in 1 second. (1000 ms/sec)
To calculate the total milliseconds, you just need to do a little math. So for the example above, it would be:
(2 hrs * 3,600,000) + (35 mins * 60,000) + (49 secs * 1,000) + (578 milliseconds) = 9,349,578 ms.
I know about the timecode info in OFS, but I can’t click on it or figure out a way to type in the numbers. The reason I’m asking about that is because I’ve heard others say they make compilations by writing down the timecodes, opening the original script in OFS, go to the timecode, cut out the part that matches their clip, and paste that into a new script. It’s not possible for me to scroll to an exact timecode down to the millisecond by hand. The other thing about timecodes I was confused about was how to find the end timecode of a clip in DaVinci Resolve. I figured it out, but it’s real annoying and prone to error as the compilations will begin to involve more and more clips.
I’ve been reading that post for nearly an hour trying to figure out how to use that tool, but it is only making me feel very dumb. I’ve downloaded the tool, but I don’t see how I load the funscripts I’m editing and how I input the timecodes so that everything matches up with my compilation.
I don’t know of a way to navigate to an exact timestamp using OFS. And yep, the tool isn’t necessarily the most user friendly. I’ll write up a quick tutorial for you and anyone else who may be having trouble with it.
Splitting - Step 1 - Folder after installation
This is what the folder should generally look like right after downloading it. It shouldn’t matter where the tool is downloaded, and nothing needs to be installed.
Splitting - Step 2 - Adding the video and the funscript
Put a copy of the source video and its funscript into that folder. It should be the same folder as “fsVideoManipulator.exe”.
Splitting - Step 3 - Determine timestamps
Determine the start and end time stamps of each clip that you want using OFS. Convert the timestamp to milliseconds. See my above comment on how to do that conversion, and also a screenshot for where to find the timestamp in OFS. Another option is to just use an online tool. There are plenty that will convert HH:MM:SS into seconds, and then you’d just multiply by 1000 to get milliseconds. Then don’t forget to add the milliseconds from the original timestamp into that calculated value! (i.e., don’t forget to add the XXX value from HH:MM:SS.XXX. It is already in milliseconds, so it requires no conversion.)
Splitting - Step 4 - Create the CSV
Copy the .csv files from the “examples” folder into the same folder where the “fsVideoManipulator.exe” is located. Or simply paste the below into a raw text editor like Notepad or Notepad++. Name that file the exactly the same as the video/funscript, but with .csv as the filetype.
Replace the values in the script with you own. It is ok to remove the “speed” values from the example. Those are the 150 and 50 in the above text. You can rename “part1”, etc if you’d like. That will just be the output file names. Finally, feel free to remove or add lines as needed. I often run it with just a single line because I only want one clip from a video.
Splitting - Step 5 - Run the tool
You should be ready to run the tool. Ensure that the .csv, .mp4, and .funscript all have the same name.
Run the “fsVideoManipulator.exe”. You should see this screen:
Click the Split button, and then select the .csv you created. The tool should immediately run, and the output in the log on the right should look something like this:
Splitting - Step 6 - Find the output files
Once the tool runs successfully, navigate to the “split” folder. You will find the output videos and funscripts there. If the timing of them is not what you were expecting, double check your timestamps. Especially if you see something like a completely empty clip, that likely means you put an end time that occurs sooner than a start time by mistake.
If you have any problems while doing this, don’t be afraid to let me know and we can troubleshoot together. Stay tuned for part 2, how to merge! (It’s much easier.)
How to merge files using fsVideoMergerSplitter.
Merging - Step 1 - Place clips in the same folder as the .exe
Cut and paste the clips to be merged into the same folder as the “fsVideoManipulator.exe”. Each clip should have the name of its video and funscript files be identical.
Merging - Step 2 - Create the merge CSV
Copy the example merge .csv from the examples folder, or just save this text with whatever name you want.
Again, you can modify this as needed. This is literally just a list of the videos to be merged. You can leave the speed number blank. So for my example, I would just have this:
The .csv you created needs to be put in the same folder as the videos and the exe.
Merging - Step 3 - Run the exe
Run the exe just as before. There are 3 buttons to pick from: FAST, MEDIUM, and SLOW BUT SAFEST. If you are merging videos that have the same resolution, framerate, etc (i.e., multiple clips from the same video), then the FAST option is fine. Otherwise, try out the MEDIUM and the SLOW to see what works best for you. You can just check the output and decide which turned out better.
Yellow highlight - Ensure that you’ve given the filepath to your installation of ffmpeg. If you don’t have ffmpeg installed, that is why you’re having problems. However, I’m pretty sure you already needed it for OFS and any video editing software, so you probably just need to find it. I’m pretty sure the path in my screenshot below is the default one.
Blue highlight - Set the output resolution. I think this should only matter if you are using the MEDIUM or SLOW options.
Click your choice and then select the .csv you created. It should run and the output should look something like this:
Merging - Step 4 - Find the output
The output video and funscript should be found in the “merge” folder. Don’t forget to move or rename the output files, because next time you run the tool if there is already an output.mp4, the tool will fail until you delete that file. In other words, it will just fail rather than replacing the existing file.
And there you have it! Feel free to hit me up with questions. Happy scripting!
@TheObsidianGeneral Wow! This is an outstanding write up!
I’ve gone through everything you’ve posted here, and I think I’m getting a better idea of the process. However, it’s the end of the day for me now so before I start asking you a bunch of questions and trying to make this all work, I’m just going to let my brain digest and go through it all again tomorrow with fresh eyes.
Thank you for all the help!
Alright so it’s not going great so far. I’ve only been able to find one online timecode converter that will do batch processing. I understand how to do the calculations, but for projects that are going to eventually have hundreds of edits I can’t do them all by hand. Unfortunately the results I’m getting from this converter don’t make sense.
This is what I’m using Timecode Converter
My timecode format is HH:MM:SS:FF.
My framerate is 29.97.
My timecode 00:02:50:02.
My new format is seconds (SECONDS,MILLISECONDS)
My new Frametrate is the same as source
This is my result:
Input @29.97 fps Output @29.97 fps
2 minutes and 50 seconds is 170 seconds, but where did the 40+ billion milliseconds come from?
If the new format is seconds,milliseconds then the result should look like 170,66.7334 right?
I tried converting your example timecode by hand, and I got the same thing that you did. I think there might be a bug in the Timecode Convert app, or else there is something about it that I simply don’t understand.
I did a little googling around Davinci Resolve (I’ve never used it), and it sounds like there might actually be a way to get the timecode in milliseconds. Rather than looking at the video timecode, you can look at the audio timecode. To display that, you right-click on the Timeline hamburger and select Show Audio Time Units. The audio timecode should be displayed in milliseconds.
I also found this tip that might save you some time if you’re looking at the video timecode:
Here is a helpful link I found as well. Is there a way to view the timecode of each individual clip? : r/davinciresolve (reddit.com)
Finally, I would be happy to put together a spreadsheet where you could enter in timecodes and framerate, and it would do the conversion for you. I think I understand it well enough to make that work. Just let me know if you would prefer Google Sheets or Microsoft Excel. (There are also open-source options like LibreOffice Calc as well.)
A spreadsheet that could automatically do the conversions would be extremely helpful, and I’m certain others would find that useful too. I don’t know that I have a preference for google sheets or excel since I don’t normally use spreadsheets anyway. I have OpenOffice on my computer so Excel would probably be fine.
Looking at the audio for the timecode in milliseconds is a really good idea. Unfortunately that reddit sub is for Premiere so the solution doesn’t work for DaVinci Resolve. I’m still looking for a solution with that angle though.
That other link you provided, for getting the timecode for each individual clip, provided some really useful information. Something that was quickly turning into a headache for me was how to make sure I was getting the correct timecode with my transitions. With a hard cut everything is pretty clear since the script should begin and end at the same moment the clip begins and ends. With transitions however, I want the next script to start and the previous script to end just as the transition begins rather than in the middle which is where the initial cut is. Now I think I can actually get those timecodes and be certain I’m getting the correct ones. It will also show up in the one and only place it actually allows me to copy the timecode rather than just reading it and typing manually into a spreadsheet.
You can also use the minutes in the fsVideoMergerSplitter btw.
2:46056 works just as good as 166056 and 2:46.056 in the csv
That’s really good to know. It would be easier to spot timecode mistakes in the minutes and seconds format rather than convert the entire number to milliseconds. When I look at minutes converted to milliseconds it becomes just a big blur of numbers to me.
Following your tutorial I was able to make a short compilation with five clips from the same video. Because my framerate was 29.97, I got decimal places on all my timecodes which fsVideoMergeSplitter didn’t like so abbreviated them all. From what I can tell, both the merged funscript and the split scripts all match up to their respective videos identical to the original which makes this part a success.
Now here’s the part where I goofed up, and things didn’t work out. As I said my original video is 29.97 fps. My project and final video that I made in DaVinci Resolve is 24 fps. Unless there’s something else at play here that I don’t understand, this seems to have caused my script and video to be just a little off. Now I can go back, start my project again from scratch, and this time set the framerate to 29.97 fps from the very beginning. However, ultimately I don’t want to make compilations from just one video which means I’m going to have to deal with a collection of framerates anyway so how would I solve that?
EDIT: If run all of my videos through HandBrake first and convert them to the same framerate as my project, would that keep all the scripts in sync when the final video is rendered?
EDIT 2: Just went through the entire process again. Started a new project with the same framerate as my video source (29.97 fps). I added basically the same clips and tried to make it as identical as possible. The end result is that my script still does not match the actions of the original. It’s also nearly identical to my first attempt, but just slightly off. Is it the 29.97 fps framerate that’s causing the problem? Should all of my videos be a round number like 24 fps or 30 fps?
EDIT 3: I converted my video to 30 fps, and tried again with a 30 fps project in DaVinci Resolve. The first action is 4 seconds in, and it is off by exactly one frame. This an improvement over the previous version which was off by 6 frames. However the first version where the final rendered video is 24 fps is slightly better than version 2 by being off by 5 frames.
I didn’t realize you could do that! Definitely gonna be using seconds and ms from now on. Thanks for building such a great tool, @overkeks!
I’m so glad to hear that you’re making good progress! I’m going to work on that spreadsheet soon, which should make doing the batch timecodes much easier. I’m excited to hear that you can copy/paste the timecode, because that should save a LOT of time. Would you do me a favor and paste an example of what gets copied when you use that method? That way I can set up the spreadsheet to correctly read the timecode without you having to tweak it at all before pasting. (Also, it breaks my heart a little that the audio timecode solution didn’t work for DaVinci Resolve. I didn’t realize that was for a different application, and I was hoping we had stumbled onto a great solution!)
As for the framerate issue… That is a bit beyond my knowledge of video editing. As I understand it, the funscript format uses timecodes, not frames. So in theory, things should continue to match up. I looked around a little and I was able to find a topic regarding framerate conversions. You may find it helpful. You could also consider reaching out to some of the more knowledgeable people in that topic and see if any of them have suggestions for you.
Does scripting a 60FPS in 30FPS mess any thing up? - Help - EroScripts
Here’s an example of the source timecode from the timecode window 00:03:08:03
The last two digits are frames. It can also be changed to show the source frame like this 4519.
I just took a look at some of my split scripts and vids from fsVideoMergerSplitter, and compared it to the original. The split vid and script matches up perfectly with the original. This suggests that there’s nothing wrong with fsVideoMergerSplitter and that it’s doing everything it’s supposed to correctly. I went back into my DR project that I used to fetch the timecodes used to create those split clips. I opened up one of the clips in a media player, scrolled through my DR project to where I found the starting timecode for that clip, and sure enough they do not match up. The clip starts several frames earlier. From all three of those tests that I talked about in my post above, I had to move my script backwards between 1 to 6 frames. From what I can tell this means that the timecode of my video is getting messed up when it’s imported into DR. Maybe this has to do with drop frames from the framerate being 29.97 fps. I’m going to try this again with a different video that was shot and scripted at 30 fps and see if this same thing happens.
Thanks for the link to that post. I’ll read through that some more, and probably post my issue over there too.
Just made a two clip edit from a single 30 fps video. Once again the split clips match up perfectly with their split scripts, but the timecodes that DR is giving me are just a little off. Just like my previous test with a (converted) 30 fps video, this one was also off by exactly one frame. Now if I just have to always shift my final script one frame forward every time I make a compilation, that’s not the worst thing in the world, but it tells me that there’s something wrong with my workflow or understanding of the process.
Alright, I’ve got a spreadsheet put together that should work some magic! It’s set up so that you just copy/paste the timecodes in, set the framerate, and then you can export the second sheet as a CSV and it’s already formatted to be used in fsVideoMergerSplitter. The only thing you will need to do is remove some extra semicolons that will show up in the CSV.
This is just my first stab at it, so please don’t hesitate to let me know if there are some things you’d like to see changed or added.
Reading through your post about the 30 fps still being off by one frame, it makes me wonder if it’s a thing where maybe DR considers a certain time code to be the “start” of the frame, while fsVideoMergerSplitter considers it to be the “end” of the frame (or vice versa). If so, there are two easy ways to fix it. First, you could just always scoot one frame to the right or left as necessary, and then go get the timecode. That will just take a little testing to figure out which way you need to go. The other option is we can update the spreadsheet to either add or subtract 1 from the number of frames when it calculates that in column F. Let me know if you want me to make that update.
Thank you so much! Hopefully I can test out the spreadsheet later, and let you know what I think.
In the meantime, I think I can declare at least a partial victory. I took my 30 fps video, ran it through HandBrake, converted it to 60 fps, started a new project with a 60 fps framerate, did everything all over again, and everything came out synced up perfectly. Next up I’m going to try this same thing with a 29.97 fps video and a 24 fps video. If those work out, then I’ll move on to combination framerates.
That’s awesome! Definitely sounds like a victory to me. Hopefully the videos with the weirder framerates will work out. I’m looking forward to hearing how it goes!