我有一个用C ++开发的简单流光,使用LibFlac和LibShout流式传输到Icecast服务器。 flac Encoder以下列方式创建:
m_encoder = FLAC__stream_encoder_new();
FLAC__stream_encoder_set_channels(m_encoder, 2);
FLAC__stream_encoder_set_ogg_serial_number(m_encoder, rand());
FLAC__stream_encoder_set_bits_per_sample(m_encoder, 16);
FLAC__stream_encoder_set_sample_rate(m_encoder, in_samplerate);
FLAC__stream_encoder_init_ogg_stream(m_encoder, NULL, writeByteArray, NULL, NULL, NULL, this);
函数writeByteArray
使用libshout中的shout_send_raw
函数将编码数据发送到Icecast。
shout_send_raw
返回发送的实际字节数,因此我假设它可以正常工作,不会发生错误。
问题是Icecast服务器不会传输我发送的数据。我在日志中看到了followint:
[2018-02-15 15:31:47] DBUG stats/modify_node_event update "/radio" total_bytes_read (20735897)
[2018-02-15 15:31:47] DBUG stats/modify_node_event update "/radio" total_bytes_sent (0)
我看到Icecast接收数据,但它不会将其发送给连接的客户端。挂载点是radio
,当我尝试使用任何媒体播放器连接到该挂载时 - 它什么都不做,没有播放。
所以我的问题是Icecast如何收到数据但不将其发送给连接的客户?
也许需要一些额外的libshout配置,这是我配置它的方式:
shout_set_format( m_ShoutData, SHOUT_FORMAT_OGG_AUDIO );
shout_set_mime( m_ShoutData, "application/ogg" );
任何帮助将不胜感激。
答案 0 :(得分:1)
总结评论中的解决方案:
FLAC具有比任何其他常用音频编解码器高得多的比特率。因此,默认设置将 NOT 工作。队列大小必须显着增加,以便完整的数据框适合它,否则,Icecast将不会在流上同步并拒绝向客户端发送数据。
这同样适用于流媒体视频。必须针对适当的挂载点或全局调整队列大小。