使用libshout将OGG Flac流式传输到Icecast

时间:2018-02-18 09:01:40

标签: c ogg shoutcast icecast flac

我有一个用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" ); 任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

总结评论中的解决方案:

FLAC具有比任何其他常用音频编解码器高得多的比特率。因此,默认设置将 NOT 工作。队列大小必须显着增加,以便完整的数据框适合它,否则,Icecast将不会在流上同步并拒绝向客户端发送数据。

这同样适用于流媒体视频。必须针对适当的挂载点或全局调整队列大小。