代码之家  ›  专栏  ›  技术社区  ›  Alex Paramonov

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

  •  2
  • Alex Paramonov  · 技术社区  · 7 年前

    我有一个用C++开发的简单拖缆,它使用LibFlac和LibShout流式传输到Icecast服务器。 flac编码器的创建方式如下:

      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 使用将编码数据发送到Icecast shout_send_raw 来自libshout的函数。 shout\u send\u原始 返回发送的实际字节数,因此我假设它正常工作,没有发生错误。 问题是Icecast服务器没有流式传输我发送的数据。我在日志中看到以下内容: [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 回复  |  直到 7 年前
        1
  •  1
  •   TBR    7 年前

    从评论中总结出解决方案:

    FLAC的比特率明显高于任何其他常用的音频编解码器。因此,默认设置将 不是 工作队列大小 必须 将显著增加,以便容纳完整的数据帧,否则,Icecast将无法在流上同步,并拒绝将数据输出到客户端。

    这显然也适用于流媒体视频。必须针对适当的装入点或全局调整队列大小。