View Full Version : Creating video from still image with MP4Box
.sk
6th February 2016, 04:16
I have a still png image and 40min long m4a audio.
Is is it possible to mux it so it will play as normal 40min long video?
This is for the purpose of later uploading to youtube.
mariush
6th February 2016, 06:06
You can use AviSynth to create a small script that will produce your video.
Once you install AviSynth you can open Notepad and after writing this, save the document with the extension .avs (save as... choose all file types, type at filename yourname.avs )
video = ImageReader("c:\path\to\your_image.jpg", fps=25, start=1, end=99999)
video
fps = 25 , the video generated on the fly will have a framerate of 25 , youtube will happily accept 25 or 30 frames per second with no problems.
start and end tell you how many frames to generate , so for example if your audio is 40 minutes long exactly, then you want 40 minutes x 60 seconds x 25 frames per second so you want to use end=60000
You should resize the image beforehand to a decent size, like 1920x1080 or 1280x720
It's ok for your video to be longer than audio by a few seconds, youtube won't mind.
Once you have this .AVS script, you can load it in Virtualdub or in MeGUI and compress the video using XVID or x264 , or you can use x264 directly using a command like this : x264.exe --tune stillimage --output "c:\path\to\output_file.mkv" "c:\path\to\avisynth_script.avs"
x264 is smart enough to recognize the still image so your video will compress super fast and will only use less than 1MB for each minute of video (it can be done to use even less but it's pointless for this exercise).
Now you can combine your generated video with your audio track, simply get MKVToolnix, open it, drag the two files in the gui and click the merge button and you'll get a MKV file with both video and audio, ready to be uploaded on Youtube.
As a tip, you can modify the script above to use more than one picture, for example here's the same script for two pictures :
sequence1 = ImageReader("c:\path\to\your_first_image.jpg", fps=25, start=1, end=10000)
sequence2 = ImageReader("c:\path\to\your_second_image.jpg", fps=25, start=1, end=10000)
video = sequence1+sequence2
video
This loads two pictures, each is shown on screen for 10000 frames ( 10000 frames / 25 fps = 400 seconds ) .. as long as both pictures have the same height and width.
.sk
6th February 2016, 11:02
Thanks a lot.
I ran into problem with non-compliant resolution (resolution is not compliant with colorspace i420) using x264 encoder.
Some way to automatically resize to mod2 resolution with width being 1280 and height kept within original aspect ratio?
I am looking for ways how to automate this process as much as possible.
By the way, how long this should take? I have i5 and ETA on 64600frames video was about 1 hour which does not seem right. :)
mariush
6th February 2016, 11:16
Yes, both width and height must be multiples of 2, but ideally they should be multiple of 8.
as for preparing pictures... see Irfanview ... very good free image viewer. But also allows you to crop pictures or add borders.
Image menu > Resize/Resample
Image menu > Change Canvas Size or Image menu > Add border/frame
There's also a very comprehensive batch conversion tool in Irfanview (File > Batch conversion/rename) , which would allow you to resize all pictures you have to have the width or height to a particular value and keep the proportions of each picture, and also set the canvas size to a particular size, all in one go. Hit the menu entry and then check the box "Use advanced options" and then hit the Advanced button, you'll see everything you'd need there.
On my computer (fx8320 , the video was encoded at around 70fps, so about 3x real time).
As a sidenote, once you have more than a few pictures, maybe it's time to look into video editing tools
ps. add --preset ultrafast to the x264 command line and it will run like crazy ... x264.exe --tune stillimage --preset ultrafast --output "c:\path\to\output_file.mkv" "c:\path\to\avisynth_script.avs"
It sacrifices thoroughness in trying to find the best way to compress each frame in the video in favor of speed, but in your case since we're dealing with the same picture over and over, the quality will still be quite good. On my pc, the speed goes up to around 205fps on average.
huhn
6th February 2016, 11:22
for a still image encode use tune stillimage, reduce bframes to 0, ref frames to 1 and try -me dia (or is there a way to disable me completely)?
this should be faster.
.sk
6th February 2016, 12:14
Thanks for the tips.
To resize with avisynth, this might work..
x = float(height) / float(width)
spline64resize(1280, round(1280.0 * x / 8.0) * 8)
vBulletin® v3.8.11, Copyright ©2000-2026, vBulletin Solutions Inc.