我用C++开发了一个简单的流线型,使用LIbFLAC和LIbHead流到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使用libshout中的shout_send_raw函数将编码数据发送到Icecast。
shout_send_raw返回实际发送的字节数,因此我假设它正常工作,不会发生错误。
问题是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" );
任何帮助都将不胜感激。

最佳答案

从评论中总结解决方案:
FLAC的比特率比任何其他常用的音频编解码器都要高得多因此,默认设置将不起作用队列大小必须显著增加,以便完整的数据帧能够容纳其中,否则,Icecast将不会在流上同步并拒绝向客户端输出数据。
这显然也适用于流媒体视频必须针对适当的装入点或全局调整队列大小。

关于c - 使用libshout将OGG Flac流式传输到Icecast,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48849975/

10-09 16:36