Giter Site home page Giter Site logo

autocut's Introduction

Autocut

I needed a way to make videos for my Calculus MOOC very quickly, and so I build the autocutter.

This tool takes a list of video files, listens to the audio to determine where I start and stop speaking, and builds an edit list suitable for MLT.

If you want help using it, please feel free to contact me.

Requirements

This is a python script packaged using setuptools. The numpy and librosa libraries are used. The python code also depends on MLT being installed.

Instructions

Here is a sample input file. Let's call it sample.xml

<?xml version="1.0" encoding="UTF-8"?>
<movie author="Jim Fowler">
  <video src="title.mp4" audio="intro.wav" in="0" out="3"/>
  <video src="welcome-to-the-course.mts"/>
  <video src="doing-work-on-paper.mts" flip="true"/>
  <video src="farewell-everybody.mts"/>
  <video src="end-title.mp4" audio="outro.wav" in="0" out="5"/>
</movie>

If you run autocut sample.xml you will get editlist.xml which you can then run through melt to produce a complete video.

The in and out timestamps are in seconds, relative to the given video file. If you don't include one of them, then the missing cutpoints are determined by listening for a human voice.

If you include a flip attribute, the video gets flipped.

If you include an audio tag, then the given audio file will play at the same time as the given video; the script creates the appropriate tractors and transitions to mix the audio in MLT.

autocut's People

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

autocut's Issues

Error when including a video with beaudiomer

When I include a video like this in beaudiomer:

\begin{frame}{Video}
\video{cavityExampleExplained.mp4}
\end{frame}

beaudiomer runs without errors but the subsequent autocut call fails with these errors:

Listening to cavityExampleExplained.mp4
/usr/local/lib/python3.8/dist-packages/librosa-0.8.0-py3.8.egg/librosa/core/audio.py:162: UserWarning: PySoundFile failed. Trying audioread instead.
warnings.warn("PySoundFile failed. Trying audioread instead.")

...

{'author': None, 'title': None, 'videos': [{'src': 'intro.wav', 'slide': 'page000.png', 'in': 0.5686666666666667, 'out': 22.878666666666668, 'id': 1}, {'src': 'slide2.wav', 'slide': 'page001.png', 'in': 2.1900000000000004, 'out': 77.40666666666667, 'id': 2}, {'src': 'slide3.wav', 'slide': 'page002.png', 'in': 0.2, 'out': 59.166666666666664, 'id': 3}, {'src': 'slide4.wav', 'slide': 'page003.png', 'in': 0.2, 'out': 11.36, 'id': 4}, {'src': 'slide5.wav', 'slide': 'page004.png', 'in': 0.20600000000000002, 'out': 18.889333333333333, 'id': 5}, {'src': 'slide6.wav', 'slide': 'page005.png', 'in': 0.2, 'out': 11.188, 'id': 6}, {'src': 'slide7.wav', 'slide': 'page006.png', 'in': 0.20600000000000002, 'out': 11.934666666666667, 'id': 7}, {'src': 'slide8.wav', 'slide': 'page007.png', 'in': 0.7393333333333334, 'out': 267.33733333333333, 'id': 8}, {'src': 'slide9.wav', 'slide': 'page008.png', 'in': 0.41933333333333334, 'out': 47.36933333333333, 'id': 9}, {'src': 'slide10.wav', 'slide': 'page009.png', 'in': 0.6326666666666667, 'out': 136.99066666666667, 'id': 10}, {'src': 'slide11.wav', 'slide': 'page010.png', 'in': 0.2, 'out': 311.11333333333334, 'id': 11}, {'src': 'slide12.wav', 'slide': 'page011.png', 'in': 0.20600000000000002, 'out': 107.956, 'id': 12}, {'src': 'slide13.wav', 'slide': 'page012.png', 'in': 1.2513333333333332, 'out': 64.39333333333333, 'id': 13}, {'src': 'slide14.wav', 'slide': 'page013.png', 'in': 1.0593333333333332, 'out': 175.28, 'id': 14}, {'src': 'slide15.wav', 'slide': 'page014.png', 'in': 0.2, 'out': 139.65733333333333, 'id': 15}, {'src': 'slide16.wav', 'slide': 'page015.png', 'in': 0.3766666666666667, 'out': 144.71333333333334, 'id': 16}, {'src': 'slide17.wav', 'slide': 'page016.png', 'in': 0.3126666666666667, 'out': 30.409333333333333, 'id': 17}, {'src': 'slide18.wav', 'slide': 'page017.png', 'in': 1.7846666666666666, 'out': 233.11866666666666, 'id': 18}, {'src': 'slide19.wav', 'slide': 'page018.png', 'in': 0.22733333333333333, 'out': 61.748, 'id': 19}, {'src': 'slide20.wav', 'slide': 'page019.png', 'in': 0.718, 'out': 107.572, 'id': 20}, {'src': 'slide21.wav', 'slide': 'page020.png', 'in': 0.7606666666666666, 'out': 35.480000000000004, 'id': 21}, {'src': 'slide22.wav', 'slide': 'page021.png', 'in': 0.2, 'out': 41.14, 'id': 22}, {'src': 'slide23.wav', 'slide': 'page022.png', 'in': 0.2, 'out': 79.476, 'id': 23}, {'src': 'slide24.wav', 'slide': 'page023.png', 'in': 0.44066666666666665, 'out': 65.396, 'id': 24}, {'src': 'slide25.wav', 'slide': 'page024.png', 'in': 2.254, 'out': 47.77466666666667, 'id': 25}, {'src': 'slide26.wav', 'slide': 'page025.png', 'in': 0.718, 'out': 22.814666666666668, 'id': 26}, {'src': 'slide27.wav', 'slide': 'page026.png', 'in': 0.9313333333333333, 'out': 12.916, 'id': 27}, {'src': 'slide28.wav', 'slide': 'page027.png', 'in': 0.6113333333333333, 'out': 14.494666666666667, 'id': 28}, {'src': 'slide29.wav', 'slide': 'page028.png', 'in': 0.6539999999999999, 'out': 30.473333333333333, 'id': 29}, {'src': 'slide30.wav', 'slide': 'page029.png', 'in': 0.3766666666666667, 'out': 34.14266666666666, 'id': 30}, {'src': 'slide31.wav', 'slide': 'page030.png', 'in': 0.5900000000000001, 'out': 30.110666666666667, 'id': 31}, {'src': 'slide32.wav', 'slide': 'page031.png', 'in': 1.2726666666666666, 'out': 70.34533333333333, 'id': 32}, {'src': 'slide33.wav', 'slide': 'page032.png', 'in': 1.166, 'out': 44.681333333333335, 'id': 33}, {'src': 'slide34.wav', 'slide': 'page033.png', 'in': 0.9313333333333333, 'out': 72.73466666666667, 'id': 34}, {'src': 'slide35.wav', 'slide': 'page034.png', 'in': 0.8246666666666667, 'out': 32.692, 'id': 35}, {'src': 'slide36.wav', 'slide': 'page035.png', 'in': 0.974, 'out': 29.918666666666667, 'id': 36}, {'src': 'cavityExampleExplained.mp4', 'overlay': 'page036.png', 'in': 1.0166666666666666, 'out': 3021.0653333333335, 'id': 37}, {'src': 'slide47.wav', 'slide': 'page037.png', 'in': 1.9126666666666665, 'out': 69.47066666666667, 'id': 38}, {'src': 'slide48.wav', 'slide': 'page038.png', 'in': 1.1019999999999999, 'out': 82.97466666666666, 'id': 39}, {'src': 'slide49.wav', 'slide': 'page039.png', 'in': 1.1233333333333333, 'out': 122.164, 'id': 40}, {'src': 'slide50.wav', 'slide': 'page040.png', 'in': 0.29133333333333333, 'out': 21.492, 'id': 41}, {'src': 'page041.png', 'in': '0', 'out': '5', 'id': 42}]}
Traceback (most recent call last):
File "/usr/local/bin/autocut", line 11, in
load_entry_point('autocut==2.0.0', 'console_scripts', 'autocut')()
File "/usr/local/lib/python3.8/dist-packages/autocut-2.0.0-py3.8.egg/autocut/cli.py", line 20, in main
tree = movie2xml(movie)
File "/usr/local/lib/python3.8/dist-packages/autocut-2.0.0-py3.8.egg/autocut/melt.py", line 134, in movie2xml
track.set('producer', overlay_id )
NameError: name 'overlay_id' is not defined

What might be the problem?
Thanks for any hint!

How to "put the video in the corner of slides"

The commit message is tantalizing, but I didn't make it work yet.
Based on guesswork, I tried

<?xml version="1.0" encoding="UTF-8"?>
<movie>
  <video src="1-1.mkv" slide="page000.png" />
  <video src="1-2.mkv" slide="page001.png" />
  <video src="1-3.mkv" />
</movie>

This produces the attached input for melt.
autocut.out.txt

This has the audiotrack over the relevant slides, but no picture from the video files.
For reference my melt command looks like

	melt -profile hdv_1080_30p -consumer avformat:out.avi in.xml

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.