我有一个在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使用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" );任何帮助都将不胜感激。
发布于 2018-02-19 12:41:38
从评论中总结出解决方案:
FLAC比任何其他常用的音频编解码器都具有非常高的比特率。因此,默认设置将无法工作。队列大小必须大幅度增加,这样才能容纳完整的数据帧,否则,Icecast将不会在流上同步并拒绝向客户端输出数据。
同样的情况显然也适用于流媒体视频。必须根据适当的挂载点或全局调整队列大小。
https://stackoverflow.com/questions/48849975
复制相似问题