我通过以下方式使用FFmpeg流式传输到我的Windows机器上的Icecast服务器(声卡线):
ffmpeg -f dshow -channels 2 -i audio="Line In" -codec:a libmp3lame -b:a 128k -legacy_icecast 1 -content_type audio/mpeg -ice_name "Radio test 1" -ice_description "This is Radio test 1" -ice_genre "Rock" -ice_url "http://www.radiotest.com" -f mp3 icecast://source:password@ip:port/mountpoint
这没关系。
但是我注意到一个Icecast统计数据,FFmpeg不会向edcast发送“audio_info”元数据,而edcast / altacast等发送它。并且当FFmpeg被强制发送时,edcast / altacast不发送“user_agent”。
我是否让FFmpeg向Icecast发送“audio_info”元数据?
答案 0 :(得分:0)
没有办法让它从FFmpeg发送每曲目元数据。您必须使用其他脚本在带外发送元数据更新。
答案 1 :(得分:0)
对于MP3,这不能起作用,因为MP3流不支持正确的元数据。您将需要一个额外的脚本来调用Icecasts元数据更新端点。
对于Ogg而言,这可以工作,但不能使用FFmpeg,因为没有办法触发它来添加元数据并启动新的链接Ogg"段"。
答案 2 :(得分:0)
无法发表评论,但这是一个开始。
/**
* Please be aware. This gist requires at least PHP 5.4 to run correctly.
* Otherwise consider downgrading the $opts array code to the classic "array" syntax.
*/
function getmp3StreamTitle($streamingUrl, $interval = 19200)
{
$needle = 'StreamTitle=';
$ua = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.110 Safari/537.36';
$opts = array('http' => array(
'method' => 'GET',
'header' => 'Icy-MetaData: 1',
'user_agent' => $ua
));
$context = stream_context_create($opts);
$stream = fopen($streamingUrl, 'r', false, $context);
if(!$stream) throw new Exception("Unable to open stream [{$streamingUrl}]");
while(true) {
$buffer = stream_get_contents($stream, $interval);
if($buffer === false) throw new Exception('Could not read from stream.');
if(strpos($buffer, $needle) !== false)
{
$text = explode($needle, $buffer)[1];
$songtext = substr($text, 1, strpos($text, ';') - 2);
break;
}
}
fclose($stream);
return $songtext;
}
ini_set('display_errors', 1);
header('Content-type: application/json');