$1*/ mo hosting! Get going with GoDaddy!

Converting Webm to MP4 using latest avconv or ffmpeg

Ok, there is no ffmpeg here since its so old and we have all been using the latest avconv. However, there are so many legacy documentation about ffmpeg conversion and webm that leaves me searching up and downs for a solutions for my problems. Although in the end, it wasn't my problem at all but i manage to resolve it somehow so writing it out might helps someone out there too.

Problems converting webm to mp4

if you are facing problems converting webm (whammy) from webrtc of Chrome using older version of ffmpeg or avconv. You are not alone. You may face the following problems

[matroska,webm @ 0x18399cb8] Unknown/unsupported CodecID V_VP9.
[matroska,webm @ 0x18399cb8] Unknown/unsupported CodecID A_OPUS.

which means your avconv doesn't really support the new A_OPUS or V_VP9. And when you try to convert your whammy webm to mp4, it will 99% throws you one of the following errors

Error while opening encoder for output stream #0:0 - maybe incorrect parameters such as bit_rate, rate, width or height


Decoder (codec id 0) not found for input stream #0:0


webm decoding for stream 0 failed


23_1460406164.wav: could not find codec parameters

and etc. but it will just get stucked at #0:0 and you will be staring at your screen for a couple of hours (if you are lucky) and wondering what the hell goes wrong when you did nothing to it.

Solution to convert webm to mp4

If you manage to debug your avconv conversion instruction, and saw the word Unknown/unsupported CodecID A_OPUS, you most probably fall into the category of having a older Ubuntu or avconv which is what happen to me. However, if you are using a older version of Ubuntu, you will need to get the latest version from Source, since installing from apt-get will only gives you what your Ubuntu version can support. Once installed has completed, you will get the latest version of avconv 11. And you will need to fire the following command

avconv -i 23_1460420555.webm -c:v libx264  -strict experimental out.mp4

and you will get the following results

[email protected]:# avconv -i 23_1460420555.webm -c:v libx264  -strict experimental out.mp4
avconv version 11.6, Copyright (c) 2000-2014 the Libav developers
  built on Apr 12 2016 01:42:20 with gcc 4.6 (Ubuntu/Linaro 4.6.3-1ubuntu5)
[matroska,webm @ 0x2082100] Estimating duration from bitrate, this may be inaccurate
Input #0, matroska,webm, from '23_1460420555.webm':
  Duration: N/A, start: 0.000000, bitrate: N/A
    Stream #0.0(eng): Video: vp8, yuv420p, 640x480, PAR 1:1 DAR 4:3, 29.97 fps, 1k tbn (default)
    Stream #0.1(eng): Audio: opus, 48000 Hz, mono, fltp (default)
File 'out.mp4' already exists. Overwrite ? [y/N] y
[libx264 @ 0x2097d80] using SAR=1/1
[libx264 @ 0x2097d80] using cpu capabilities: MMX2 SSE2Fast FastShuffle SSEMisalign LZCNT
[libx264 @ 0x2097d80] profile High, level 3.0
[libx264 @ 0x2097d80] 264 - core 120 r2151 a3f4407 - H.264/MPEG-4 AVC codec - Copyleft 2003-2011 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=6 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1 b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=25 scenecut=40 intra_refresh=0 rc_lookahead=40 rc=crf mbtree=1 crf=23.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00
Output #0, mp4, to 'out.mp4':
    encoder         : Lavf56.1.0
    Stream #0.0(eng): Video: libx264, yuv420p, 640x480 [PAR 1:1 DAR 4:3], q=-1--1, 29.97 fps, 2997 tbn, 29.97 tbc (default)
      encoder         : Lavc56.1.0 libx264
    Stream #0.1(eng): Audio: libvo_aacenc, 48000 Hz, mono, s16, 200 kb/s (default)
      encoder         : Lavc56.1.0 libvo_aacenc
Stream mapping:
  Stream #0:0 -> #0:0 (vp8 (native) -> h264 (libx264))
  Stream #0:1 -> #0:1 (opus (native) -> aac (libvo_aacenc))
Press ctrl-c to stop encoding
Non-monotonous DTS in output stream 0:1; previous: 10576, current: 8864; changing to 10577. This may result in incorrect timestamps in the output file.
Non-monotonous DTS in output stream 0:1; previous: 10577, current: 9888; changing to 10578. This may result in incorrect timestamps in the output file.
Non-monotonous DTS in output stream 0:1; previous: 38912, current: 37584; changing to 38913. This may result in incorrect timestamps in the output file.
Non-monotonous DTS in output stream 0:1; previous: 38913, current: 38608; changing to 38914. This may result in incorrect timestamps in the output file.
Non-monotonous DTS in output stream 0:1; previous: 74064, current: 72400; changing to 74065. This may result in incorrect timestamps in the output file.
Non-monotonous DTS in output stream 0:1; previous: 74065, current: 73424; changing to 74066. This may result in incorrect timestamps in the output file.
frame=   58 fps=  0 q=-1.0 Lsize=     133kB time=1.84 bitrate= 593.4kbits/s
video:115kB audio:15kB other streams:0kB global headers:0kB muxing overhead: 2.336649%
[libx264 @ 0x2097d80] frame I:1     Avg QP:20.91  size: 26829
[libx264 @ 0x2097d80] frame P:51    Avg QP:22.32  size:  1685
[libx264 @ 0x2097d80] frame B:6     Avg QP:25.44  size:   638
[libx264 @ 0x2097d80] consecutive B-frames: 86.2%  0.0%  0.0% 13.8%
[libx264 @ 0x2097d80] mb I  I16..4: 19.3% 67.0% 13.7%
[libx264 @ 0x2097d80] mb P  I16..4:  0.9%  1.0%  0.1%  P16..4: 22.0%  4.0%  3.6%  0.0%  0.0%    skip:68.5%
[libx264 @ 0x2097d80] mb B  I16..4:  0.1%  0.1%  0.0%  B16..8: 30.9%  0.3%  0.0%  direct: 0.2%  skip:68.4%  L0:42.6% L1:56.6% BI: 0.8%
[libx264 @ 0x2097d80] 8x8 transform intra:58.6% inter:73.5%
[libx264 @ 0x2097d80] coded y,uvDC,uvAC intra: 66.9% 77.4% 53.2% inter: 10.0% 11.2% 1.3%
[libx264 @ 0x2097d80] i16 v,h,dc,p: 21% 11% 44% 24%
[libx264 @ 0x2097d80] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 17% 13% 34%  5%  5%  6%  7%  7%  6%
[libx264 @ 0x2097d80] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 18% 21% 31%  5%  6%  5%  6%  5%  4%
[libx264 @ 0x2097d80] i8c dc,h,v,p: 64% 17% 16%  3%
[libx264 @ 0x2097d80] Weighted P-Frames: Y:0.0% UV:0.0%
[libx264 @ 0x2097d80] ref P L0: 70.3% 20.2%  4.6%  4.9%
[libx264 @ 0x2097d80] ref B L0: 96.0%  2.2%  1.8%
[libx264 @ 0x2097d80] ref B L1: 89.9% 10.1%
[libx264 @ 0x2097d80] kb/s:482.04

And you will get a nice video with good quality right to your face! But do take note that the "Non-monotonous DTS in output" warning. Although its a warning, if you have compile avconv wrongly, your version conversion will not work. And if you are using the wrong encoder, pretty much nothing works for you and that's how pussy avconv can be about its encoding and stuff.

Of course, there are a good links to avconv that you could read up! especially what each avconv parameter means!

Installing avconv from source in Ubuntu

This is pretty interesting as avconv is a pretty sensitive fellow. If you do this wrongly, your avconv is pretty much not workable no matter how you are going to spin this. Hence, i do myself a favour and write this up instead. Now, before i began, let me explain what version of Ubuntu i am using. I am on Ubuntu 12.04.5 LTS and if i do the following from repo

sudo apt-get install ffmpeg libav-tools

I will be getting myself avcon version 8.x.x since i am on a older version of Ubuntu. Hence, the installed of avcon from source.

Removing older avconv or ffmpeg

Before we do anything at all, we need to remove the older version of avcon.

apt-get remove --purge libav-tools

and this will remove the built in avconv that you might have installed

Installing prerequisite files

Now, fire the below command to install everything you may need for your avconv compilation

apt-get install build-essential
apt-get install yasm
apt-get install libfdk-aac-dev
apt-get install libx264-dev

Once you have done that, we are good to go!

Installing avconv from source

I am going to install avconv version 11 from libav.org.

wget https://libav.org/releases/libav-11.6.tar.gz  --no-check-certificate
tar zxvf libav-11.6.tar.gz
cd libav-11.6/
./configure --enable-libvo-aacenc --enable-gpl --enable-nonfree --enable-version3 --enable-libx264 --enable-static --disable-shared
make && make install

After you have finished compilation (which takes some time), you are pretty much installed with the newer version of avconv! Not that tough right?

Setup OpenVPN on Proxmox LXC

Following the previous tutorial of setting up LXC, now i would like to setup my OpenVPN into Proxmox LXC container!

Adding Dev/Tun into LXC

On the host machine, we need to enable Tun for OpenvVPN on our LXC machine, go to the path /var/lib/lxc/xxx/config and add the following to the last line,

lxc.cgroup.devices.allow = c 10:200 rwm

and that's all we need to do. restart the lxc container.

Adding tun file into LXC container

Now login to your LXC container and fire the following command,

cd /dev
mkdir net
mknod net/tun c 10 200
chmod 0666 net/tun

this will create the net/tun directory and file, restart the machine and we are good to go!

Install OpenVPN on Proxmox LXC

Installing OpenVPN can never be easier in just 5 minutes which i wrote previously. But i will just summarise here, all you need to do is to fire the following into your LXC using NoVNC or SSH,

wget git.io/vpn --no-check-certificate -O ~/openvpn-install.sh; bash openvpn-install.sh

Follow all the instruction and we are good to go!

List of Proxmox important configuration files directory

Ok, this is it, there are many times when i need to find the path to certain configuration regardless of Proxmox or LXC or KVM or OpenVZ configuration file and i always need to 'remember' where it is and if you do this daily in and out, you might have an idea, if not, this is just another digging the web task! How about recording all these down for me instead? Hence, here are all the important path for anyone who needs it when dealing with Proxmox!

=== OpenVZ Section ===

config: /etc/vz/conf/xxx.conf
data: /var/lib/vz/root/xxx
template: /var/lib/vz/template/cache
snapshot: /var/lib/vz/dump
OpenVZ config: /etc/vz/vz.conf

=== KVM Section ===

config: /etc/pve/qemu-server/xxx.conf
data: /var/lib/vz/images/xxx
template: /var/lib/vz/template/iso
snapshot: /var/lib/vz/dump

=== LXC Section ===

config: /var/lib/lxc/xxx/config
data: /var/lib/vz/images/xxx
template: /var/lib/vz/template/cache
snapshot: /var/lib/vz/dump

=== Cluster Section ===
config: /etc/pve/cluster.conf
nodes vm config: /etc/pve/nodes/xxx/xxx/qemu-server/xxx.conf
=== Files ===

 corosync.conf  => corosync/cman cluster configuration file (previous to PVE 4.x this file was called cluster.conf)
 storage.cfg   => PVE storage configuration
 user.cfg      => PVE access control configuration (users/groups/...)
 domains.cfg   => PVE Authentication domains 
 authkey.pub   => public key used by ticket system

 priv/shadow.cfg  => shadow password file
 priv/authkey.key => private key used by ticket system

 nodes/${NAME}/pve-ssl.pem                 => public ssl key for web server
 nodes/${NAME}/priv/pve-ssl.key            => private ssl key
 nodes/${NAME}/qemu-server/${VMID}.conf    => VM configuration data for KVM VMs
 nodes/${NAME}/openvz/${VMID}.conf         => VM configuratin data for OpenVZ containers

=== Symbolic links ===

 local => nodes/${LOCALNAME}
 qemu-server => nodes/${LOCALNAME}/qemu-server/
 openvz => nodes/${LOCALNAME}/openvz/

=== Special status files for debugging (JSON) ===

 .version    => file versions (to detect file modifications)
 .members    => Info about cluster members
 .vmlist     => List of all VMs
 .clusterlog => Cluster log (last 50 entries)
 .rrd        => RRD data (most recent entries)

=== Enable/Disable debugging ====

 # enable verbose syslog messages
 echo "1" >/etc/pve/.debug 

 # disable verbose syslog messages
 echo "0" >/etc/pve/.debug 

more info. You are welcome.

Setup LXC and Nat on Proxmox

The latest Proxmox 4.0 no longer support OpenVZ and we are met with LXC, Linux Container, which is kinda the next thing. But how do we setup a NAT on a LXC? Is it different from the original OpenVZ. Well, its kinda the same. But i will cut the bullshit here and goes straight to the objective. Here, we will try to create a LXC container in Proxmox and allow the same public ip to connect to the LXC container, in and out.

Installing LXC Container on Proxmox

First let's setup a container, let's create a Ubuntu container by selecting the template.

Screen Shot 2016-03-13 at 4.11.51 AM

Once we selected, let's setup the network area, take note that i have the internet bridge of vmbr1 (which will need to be change later)
Screen Shot 2016-03-13 at 4.12.33 AM

I am giving my LXC container the local ip of, just ignore the /24 for now. And setup the DNS

Screen Shot 2016-03-13 at 4.16.01 AM

And we are all done, now starts the machine and we are ready to go!

Setup NAT on Proxmox

Now this is the important part, we have 2 things to do, the first setup a new network on /etc/network/interface as show below,

auto vmbr2
#private sub network
iface vmbr2 inet static
        bridge_ports none
        bridge_stp off
        bridge_fd 0

        post-up echo 1 > /proc/sys/net/ipv4/ip_forward
        post-up   iptables -t nat -A POSTROUTING -s '' -o vmbr1 -j MASQUERADE
        post-down iptables -t nat -D POSTROUTING -s '' -o vmbr1 -j MASQUERADE

Do take note that i have added the above so that my container will have internet for all ip within the range of (1-255). Now restart the network

/etc/init.d/networking restart

after restarting update the LXC container to use vmbr2.
Screen Shot 2016-03-13 at 4.20.57 AM
Now access your LXC container via NoVNC (Chrome or Firefox) and you should be able to connect to the internet!
Screen Shot 2016-03-13 at 4.23.04 AM

Allow outside connect to LXC

Although you have internet, you will notice that you are not allow to connect to your LXC machine, this is because you did not allow outside to connect to your LXC container. In order to do that, you will need to add stuff into your iptables, add these to your host machine,

#port forward port 2222 to our LXC machine port 22 so we could ssh
iptables -A PREROUTING -i vmbr1 -p tcp -m tcp --dport 2222 -j DNAT --to-destination
#we did the below just now on network interface config
iptables -A POSTROUTING -s -o vmbr1 -j MASQUERADE
#this allows outside to connect to your LXC machines
iptables -A POSTROUTING -s -o vmbr1 -j SNAT --to-source

What we did on the vmbr2 just now is shown above, if you do not want to add that on the interface section, just do it here. Once you've done that, you should be able to ssh into your LXC container as well! All good!