Real-time applications, such as video conferences, have strong Quality of Service requirements for ensuring a decent Quality of Experience. Nowadays, most of these conferences are performed over wireless devices. Thus, an appropriate management of both heterogeneous mobile devices and network dynamics is necessary. Software Defined Networking enables the use of multicasting and stream layering inside the network nodes, two techniques able to enhance the quality of live video streams. In this paper, we propose two algorithms for building and maintaining multicast sessions in a software-defined network. The first algorithm sets up the initial multicast trees for a given call. It optimally places the stream layer adaptation function inside the core network in order to minimize the bandwidth consumption. This algorithm has two versions: the first one, based on shortest path trees is minimizing the latency, while the second one, based on spanning trees is minimizing the bandwidth consumption. The second algorithm adapts the multicast trees according to the network changes occurring during a call. It does not recompute the trees, but only relocates the stream layer adaptation functions. It requires very low computation at the controller, thus making our proposal fast and highly reactive. Extensive simulation results confirm the efficiency of our solution in terms of processing time and bandwidth savings compared to existing solutions such as multiple unicast connections, Multipoint Control Unit solutions and application layer multicast. Recompute all the bitrates 5 foreach Multicast tree T i do 6 RelocateUp(T i , r) 7 if Uplink Bandwidth of a sender decreases (B(s i ) ↓) then 8 Recompute the uplink bitrate of s i 9 RelocateDown(c) where {c} = C(s i ) 10 if Uplink Bandwidth of a sender increases (B(s i ) ↑) then 11 Recompute the uplink bitrate of s i 12 Recompute the downlink bitrates of each r i,j 13 foreach receiver r i,j of T i do 14 if the bitrate of r i,j increased after recomputation then 15 RelocateUP(T i , r i,j ) 16 if Downlink bandwidth of a receiver r increases (B(r) ↑) then 17 Recompute all the bitrates 18 foreach Tree T i do 19 if the bitrate of s i increases after recomputation then 20 foreach receiver r i,j of T i do 21 if the bitrate of r i,j increased after recomputation then 22 RelocateUp(T i , r i,j ) 23 else 24 RelocateUp(T i , r)