Przede wszystkim blad popelniasz stawiajac plusa za nawiasem. Powoduje to, ze podciag zostaje dopasowany wielokrotnie, ale zwracane jest tylko ostatnie dopasowanie (bitrate).
Jesli chodzi o najmniejsza mozliwa ilosc linijek (co najczesciej przeklada sie na efektywnosc) do wyciagniecia wszystkiego to moj pomysl jest taki:
<?php
preg_match_all('#(?:(Duration|start|bitrate): (?P<wartosc>.*?)(?=,|r?n))|(?:(Video|Audio): (?P<av>.*?)(?=r?n))#',$txt, $matches, PREG_SET_ORDER
);
'duration' => $matches[0]['wartosc'],
'start' => $matches[1]['wartosc'],
'bitrate' => $matches[2]['wartosc'],
'video' => explode(', ', $matches[3]['av']), 'audio' => explode(', ', $matches[4]['av']), );
?>
Jak masz pytania dlaczego tak to smialo. Tylko najlepiej wycinaj konkretne kawalki wyrazenia i o nie pytaj.