<div dir="ltr">Cari, <div>ho postato sul sito l'articolo sullo stream con ffmpeg. Ho avuto qualche problema con la notazione della stesura dell'articolo, per mia ignoranza. Se qualcuno ci può buttare un occhio...</div><div>Comunque accodo anche qui l'articolo:</div><div>------------------------</div><div><div>ffmpeg questo s-conosciuto.</div><div>Durante gli ultimi incontri ci siamo concentrati sulla possibilità di sperimentare lo streaming audio-video sfruttando in parte la rete ninux.</div><div>L'idea è stata quella di sfruttare l'occasione della festa dell'Ex-Fila degli scorsi 11-12-13 settembre come pretesto per mettere alla prova la rete e streammare qualche evento musicale e così abbiamo iniziato la sperimentazione.</div><div>Per ridurre le variabili in gioco abbiamo scelto il canale di youtube come streamer finale verso l'utente, per ovvii motivi, così ci siamo concentrati sul software ffmpeg, per la cattura, l'encoding e la pubblicazione server-client per la trasmissione verso i server di youtube.</div><div><br></div><div>1) La cattura è avvenuta sfruttando una banale web-cam usb rilevata su /dev/video0 di un portatile. La riga di comando per catturare dal dispositivo video e audio e stremmare su un server è simile alla seguente:</div><div><br></div><div>ffmpeg -f v4l2 -i /dev/video0 -f alsa -ac 2 -i pulse -s 426x240 -vcodec libx264  -pix_fmt yuv420p -vb 1000k -profile:v auto -preset:v fast  -g 60 -r 30 -acodec libmp3lame -ab 128k -f flv "rtmp://<a href="http://a.rtmp.youtube.com/live2/nome.utente.aaaa-bbbb-cccc-dddd">a.rtmp.youtube.com/live2/nome.utente.aaaa-bbbb-cccc-dddd</a>"</div><div>Descrizione di alcuni parametri:</div><div>-i = input</div><div>-ac = numero di canali audio</div><div>-s 426x240 = risoluzione del frame. I formati accettati da youtube sono: 426x240 854x480 1280x720 </div><div>-vcodec libx264 = video codec suggerito da youtube</div><div>-pix_fmt yuv420p = formato del pixel richiesto da youtube</div><div>-vb = video bitrate adeguato alla risoluzione scelta.</div><div>-preset:v fast = è la qualità con cui viene effettuato l'encoding. Migliore è la qualità (slow), maggiore impegno per la cpu ma flusso più leggero sulla rete!</div><div>-g 60 = video gop size. E' la quantità di fotogrammi tra un keyframe e l'altro. 60 significa un keyframe ogni 2 secondi (suggerito da youtube) se imposto il framerate a 30.</div><div>-r 30 = framerate (richiesto da youtube)</div><div>-acodec libmp3lame oppure aac è il codec di compressione audio richiesto da youtube.</div><div>-ab 128k = bitrate audio.</div><div><br></div><div>2) La seconda parte della riga di comando produce l'output verso i server youtube, rispettando i requisiti severi di quest'ultimo.</div><div>3) Qui sono sorti i primi problemi. La banda in upload da Ex-Fila non era sufficiente così abbiamo pensato di utilizzare un tool di ffmpeg, ffserver che si occupa di pubblicare una sorgente audio-video, dopo averla encodata nel formato adatto, nella nostra rete ninux.</div><div>ffserver -f ffserver.conf</div><div><br></div><div>[ffserver.conf]</div><div>HTTPPort 8091</div><div>HTTPBindAddress 0.0.0.0<br></div><div>MaxHTTPConnections 1000<br></div><div>MaxClients 10<br></div><div>MaxBandwidth 333000<br></div><div>CustomLog -<br></div><div><br></div><div><Feed feed1.ffm></div><div><span class="" style="white-space:pre">     </span>File /tmp/feed1.ffm<br></div><div><span class="" style="white-space:pre">      </span>FileMaxSize 400K<br></div><div><span class="" style="white-space:pre"> </span>ACL allow 127.0.0.1<br></div><div><span class="" style="white-space:pre">      </span>launch ffmpeg -f v4l2 -i /dev/video0 -f alsa -ac 2 -i pulse <br></div><div></Feed><br></div><div><br></div><div><stream live.flv><br></div><div><span class="" style="white-space:pre">     </span>Format flv<br></div><div><span class="" style="white-space:pre">       </span>Feed feed1.ffm</div><div><span class="" style="white-space:pre">     </span>VideoCodec libx264<br></div><div><span class="" style="white-space:pre">       </span>VideoFrameRate 30 <br></div><div><span class="" style="white-space:pre">      </span>VideoBitRate 800<br></div><div><span class="" style="white-space:pre"> </span>VideoSize 426x240 #854x480 #1280x720 #426x240<br></div><div><span class="" style="white-space:pre">    </span>VideoGopSize 30<br></div><div><span class="" style="white-space:pre">  </span>VideoBufferSize 1000<br></div><div><span class="" style="white-space:pre">     </span>AVOptionVideo crf 23<br></div><div><span class="" style="white-space:pre">     </span>AVOptionVideo preset fast profile auto  <br></div><div><span class="" style="white-space:pre">        </span>PixelFormat yuv420p<span class="" style="white-space:pre">       </span><br></div><div><span class="" style="white-space:pre"> </span>AVOptionVideo flags +global_header<br></div><div>       AudioCodec aac<br></div><div><span class="" style="white-space:pre">     </span>Strict -2<br></div><div><span class="" style="white-space:pre">        </span>AudioBitRate 128<br></div><div><span class="" style="white-space:pre"> </span>AudioChannels 2<br></div><div><span class="" style="white-space:pre">  </span>AudioSampleRate 44100<br></div><div><span class="" style="white-space:pre">    </span>AVOptionAudio flags +global_header<br></div><div></Stream><br></div><div><br></div><div><Stream stat.html><br></div><div><span class="" style="white-space:pre">     </span>Format status<br></div><div><span class="" style="white-space:pre">    </span>ACL allow localhost<br></div><div><span class="" style="white-space:pre">      </span>ACL allow 192.168.0.0 192.168.255.255<br></div><div></Stream><br></div><div><br></div><div><Redirect index.html><br></div><div><span class="" style="white-space:pre">       </span>URL <a href="http://www.ffmpeg.org/">http://www.ffmpeg.org/</a><br></div><div></Redirect><br></div><div><br></div><div>A questo punto è bastato utilizzare un'altra macchina su un nodo direttamente collegato alla fibra 30/3 con un ffmpeg che richiedeva al ffserver il flusso e lo "copiava" sui server youtube. Questa è la riga di comando:<br></div><div>ffmpeg -i <a href="http://10.150.22.xxx:8091/live.flv">http://10.150.22.xxx:8091/live.flv</a> -codec:copy -f flv "rtmp://<a href="http://a.rtmp.youtube.com/live2/nome.utente.aaaa-bbbb-cccc-dddd">a.rtmp.youtube.com/live2/nome.utente.aaaa-bbbb-cccc-dddd</a>"</div><div><br></div><div>Questa ci è sembrata la soluzione ideale, anche se perfezionabile, per sfruttare la rete ninux ad alta velocità e uscire da una fibra per l'upload.</div><div>Anche se tecnicamente tutto ha funzionato, i risultati in termini di qualità non sono stati all'altezza delle aspettative a causa della rete attualmente non in perfetta efficienza, ma abbiamo già programmato una serie di test per individuare i nodi deboli da potenziare.</div><div><br></div></div></div>