lililirururu 2025-09-21 16:56 采纳率: 0%
浏览 15

ffmpeg推流hls

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

img

  • 写回答

5条回答 默认 最新

  • 檀越@新空间 2025-09-21 16:57
    关注

    下午好🌅🌅🌅
    本答案参考通义千问

    在使用 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 无法及时同步音视频流。


    ✅ 问题分析

    1. HLS 流格式要求

    HLS 是基于 MPEG-TS 的流媒体协议,它对时间戳(PTS/DTS)有严格的要求。特别是对于 纯音频流(如 MP3、AAC),如果没有正确的封装和时间戳设置,容易出现同步问题。

    2. VLC 报错原因

    • “ES_OUT_SET_(GROUP_)PCR is called too late” 表示 VLC 在等待 PCR 时超时。
    • 这个错误通常出现在没有正确设置 packet_timestream_index 的情况下。
    • 如果是纯音频数据,可能没有有效的 PCR 信息。

    🔧 解决方案

    1. 使用合适的编码器和容器格式

    确保你使用的是支持 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


    2. 确保音频有正确的 PTS 和 DTS

    如果你是通过自定义音频帧推送(例如通过 av_read_frame() 自定义处理),请确保每帧都有正确的 pkt->ptspkt->dts

    ✅ 示例代码片段(C/C++):

    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->ptspkt->dts 是递增的,并且与时间基一致。


    3. 添加 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 分片。


    4. 调整 hls_flagshls_playlist_type

    确保 HLS 参数配置正确:

    | 参数 | 说明 | |------|------| | -hls_time 4 | 每个 TS 片段长度(秒) | | -hls_playlist_type vod | 适用于点播模式(非直播) | | -hls_flags +split_by_time+append_list | 确保分片正确 |


    5. 使用 VLC 检查流是否正常

    在 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 报错。


    如有更多关于音频编码、时间戳同步的问题,欢迎继续提问!

    评论

报告相同问题?

问题事件

  • 创建了问题 9月21日