Sunday 17 February 2013

Muxing Audio stream of different play length onto a Video Stream

 I have been creating a some screencasts and posting the same on my blog recently. The list of videos have been linked in a separate videos tab. But whenever I uploaded the video onto youtube, it would complain that it is not able to detect any audio stream on my videos. That triggered an interest in experimenting with adding a sound track to one of my videos. I started searching on the net and tried to get some audio clips filed under "Creative commons" license. I found a webpage (Legal Music For Videos) which lists many sites which showcase good audio content. I narrowed down the choice of tracks to two of them and finally choose the first one.
 Now comes the hard part of muxing / mixing of the audio track onto videos. Two potential candidate emerged that can easily mix audio streams onto video files. Both are command line tools (mencoder , ffmpeg). I saw sample code for both of them here. I also found that in order to use mencoder(based on mplayer), i had to un-install mplayer2-as-mplayer as it conflicts with mplayer backend :-(. I did not want to do this and opted for ffmpeg instead.
The command to mix the audio into video is pretty basic
ffmpeg -i <inputVideo> -i <inputAudio> -c copy <outputvideo>
 I choose one of my recent videos and tried to add the sound track. I substituted the file names as appropriate and got the below command and it did produce a output file. But when i played the output video i found that audio kept playing even after the video had ended. I realised that this was due to the audio track length being greater than that of video.
ffmpeg -i YaSTAddCustomRepo.webm -i Dwaram_Venkataswami_Naidu.mp3 -c copy output.avi
 After making a few more search I found this page which talked about using the "shorten" option. I opened "man" for ffmpeg in GNOME "help browser" using command launcher (Alt+F2) and command "xdg-open man:ffmpeg".Demystifying Man explains various ways of using man command. I found that "shortest" option should be used in a manner as shown below and came up with revised code to convert the video.
-shortest (output) - Finish encoding when the shortest input stream ends.
$ffmpeg -i YaSTAddCustomRepo.webm -i Dwaram_Venkataswami_Naidu.mp3 -shortest -c copy output.avi
Demo video where i have mixed audio stream and video Stream of different playlengths. Since the audio is lifted from a Gramophone record it is course at some places.

No comments:

Post a Comment