纯音频数据使用ffmpeg代码推流hls,vlc报错ES_OUT_SET_(GROUP_)PCR is called too late (pts_delay increased to 1000 ms)

纯音频数据使用ffmpeg代码推流hls,vlc报错ES_OUT_SET_(GROUP_)PCR is called too late (pts_delay increased to 1000 ms)

下午好🌅🌅🌅
本答案参考通义千问
在使用 FFmpeg 推流 HLS(HTTP Live Streaming)时,如果遇到 VLC 报错:
ES_OUT_SET_(GROUP_)PCR is called too late (pts_delay increased to 1000 ms)
这通常意味着 音频或视频的 PTS(Presentation Time Stamp)与 PCR(Program Clock Reference)之间存在较大的延迟,导致 VLC 无法及时同步音视频流。
HLS 是基于 MPEG-TS 的流媒体协议,它对时间戳(PTS/DTS)有严格的要求。特别是对于 纯音频流(如 MP3、AAC),如果没有正确的封装和时间戳设置,容易出现同步问题。
packet_time 或 stream_index 的情况下。确保你使用的是支持 HLS 的编码器,并且输出为 MPEG-TS 格式,而不是直接输出为 .m3u8 文件。
ffmpeg -f alsa -i hw:0,0 \
-c:a aac \
-f hls \
-hls_time 4 \
-hls_playlist_type vod \
-hls_segment_filename "output_%03d.ts" \
-hls_flags +split_by_time+append_list \
output.m3u8
注意: 如果你的输入是纯音频文件(如
.mp3),请先用-i input.mp3替换-f alsa -i hw:0,0。
如果你是通过自定义音频帧推送(例如通过 av_read_frame() 自定义处理),请确保每帧都有正确的 pkt->pts 和 pkt->dts。
AVPacket *pkt = av_packet_alloc();
// 假设你已经填充了 pkt->data 和 pkt->size
pkt->stream_index = audio_stream->index;
pkt->pts = av_rescale_q(pkt->dts, audio_stream->time_base, AV_TIME_BASE);
pkt->dts = av_rescale_q(pkt->dts, audio_stream->time_base, AV_TIME_BASE);
av_interleaved_write_frame(format_ctx, pkt);
重点: 确保
pkt->pts和pkt->dts是递增的,并且与时间基一致。
mpegts 封装格式HLS 需要将音频封装为 mpegts 格式,再切分为 .ts 片段。你可以显式指定:
ffmpeg -i input.mp3 \
-f mpegts \
-codec:a aac \
-mpegts_service_type dvb \
-flags +low_delay \
-map 0:a \
-f hls \
-hls_time 4 \
-hls_playlist_type vod \
-hls_segment_filename "output_%03d.ts" \
output.m3u8
重点: 使用
-f mpegts封装音频,确保生成.ts文件,再通过 HLS 分片。
hls_flags 和 hls_playlist_type确保 HLS 参数配置正确:
| 参数 | 说明 |
|------|------|
| -hls_time 4 | 每个 TS 片段长度(秒) |
| -hls_playlist_type vod | 适用于点播模式(非直播) |
| -hls_flags +split_by_time+append_list | 确保分片正确 |
在 VLC 中打开 http://your-server/output.m3u8,观察是否有音频播放。如果仍然报错,请检查:
.ts 文件都成功生成?mpegts 封装?| 问题 | 解决方案 |
|------|----------|
| ES_OUT_SET_PCR 报错 | 确保音频有正确的 PTS/DTS,使用 mpegts 封装 |
| 纯音频推流失败 | 使用 aac 编码并封装为 mpegts |
| VLC 无法播放 | 检查 .ts 文件是否完整,确认 HLS 配置正确 |
ffmpeg -f alsa -i hw:0,0 \
-c:a aac \
-f mpegts \
-mpegts_service_type dvb \
-flags +low_delay \
-map 0:a \
-f hls \
-hls_time 4 \
-hls_playlist_type vod \
-hls_segment_filename "output_%03d.ts" \
-hls_flags +split_by_time+append_list \
output.m3u8
重点: 使用
mpegts封装音频,避免 VLC 报错。
如有更多关于音频编码、时间戳同步的问题,欢迎继续提问!