久违の欢喜 2024-04-26 09:13 采纳率: 0%
浏览 12
已结题

为什么使用javacv转封装rtsp为rtmp时出现如下问题:[h264 @ 000000004faf7500]no frame?

使用javacv转封装rtsp为rtmp时出现如下问题:
[h264 @ 000000004faf7500]no frame!
[h264 @ 000000004faf7500] non-existing PPS 0 referenced
[h264 @ 000000004faf7500] non-existing PPS 0 referenced
[h264 @ 000000004faf7500] decode_slice_header error

  • 写回答

18条回答 默认 最新

  • 阿里嘎多学长 2024-04-26 09:13
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    【问题概括】:这个问题的目的是要解决在使用JavaCV进行RTSP到RTMP转封装过程中遇到的解码错误,具体表现为解码器接收到的数据包中存在引用了不存在的帧或参数集(PPS),导致无法正常解码视频流。

    【问题出现原因】:根据标题和详细内容,这个问题可能由以下几个原因导致:

    1. RTSP流本身可能存在问题,比如视频流的SPS(序列参数集)或PPS(图像参数集)未正确发送或丢失,这会导致解码器无法正确初始化解码过程。
    2. JavaCV或FFmpeg在处理RTSP流时,可能未能正确地处理关键帧或参数集,或者在转封装过程中丢失了这些信息。
    3. 网络问题,如延迟或丢包,可能导致关键帧或参数集未能及时到达解码器。

    【问题解决方案】:为了解决这个问题,可以尝试以下步骤:

    1. 验证RTSP流是否稳定并且包含完整的SPS和PPS。可以使用网络抓包工具(如Wireshark)来检查RTSP流的数据。
    2. 检查JavaCV和FFmpeg的版本是否支持当前处理的视频编码格式,并且是否存在已知的bug。
    3. 尝试修改JavaCV中的FFmpegFrameRecorder的recordPacket方法,确保在写入包时正确处理PTS和DTS,避免解码器错误。
    4. 如果网络不稳定,尝试使用更可靠的网络连接或使用支持丢包恢复的编解码器特性。

    【提供代码】:以下是修改FFmpegFrameRecorder中的recordPacket方法的代码示例,该方法来源于搜索结果【2】和【5】:

    // 在FFmpegFrameRecorder的recordPacket方法中
    public void recordPacket(AVPacket pkt) {
        // (1)注释掉pkt.dts(AV_NOPTS_VALUE);
        // (2)在视频帧writePacket之前增加:
        pkt.dts(av_rescale_q_rnd(pkt.dts(), in_stream.time_base(), video_st.time_base(),
        (AV_ROUND_NEAR_INF | AV_ROUND_PASS_MINMAX)));
        // (3)在音视帧writePacket之前增加:
        pkt.dts(av_rescale_q_rnd(pkt.dts(), in_stream.time_base(), audio_st.time_base(),
        (AV_ROUND_NEAR_INF | AV_ROUND_PASS_MINMAX)));
        // 原始的recordPacket代码...
    }
    

    【代码运行方式】:要运行上述代码,你需要在JavaCV项目的FFmpegFrameRecorder类中找到recordPacket方法,并进行相应的修改。确保你的开发环境已经配置了JavaCV和FFmpeg的依赖,并且在使用支持的Java版本。

    【代码预期运行结果】:修改后的代码应该能够减少或消除解码错误,使得RTSP到RTMP的转封装过程更加稳定,视频流可以被正确解码和播放。

    【推荐相关链接】:

    1. javaCV开发详解之8:转封装在rtsp转rtmp流中的应用(无须转码,低资源消耗)【2】
    2. javaCV开发详解之8:转封装在rtsp转rtmp流中的应用(无须转码,更低的资源消耗)【5】
    3. 使用JavaCV实现海康rtsp转rtmp实现无插件web端直播(无需转码,低资源消耗)【6】
    4. javaCV实现rtsp转rtmp_mob649e8155b018的技术博客【1】
    5. javacv将rtsp转封装为rtmp推流给srs,可以通过vlc获取rtmp【7】
    6. RTSPtoHTTP-FLV: 使用JavaCV开发的rtsp流转http-flv(rtmp也支持)【8】
    7. javaCV开发详解之8:转封装在rtsp转rtmp流中的应用(无须转码,更低的资源消耗)【9】
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 5月4日
  • 创建了问题 4月26日

悬赏问题

  • ¥15 matlab 用yalmip搭建模型,cplex求解,线性化处理的方法
  • ¥15 qt6.6.3 基于百度云的语音识别 不会改
  • ¥15 关于#目标检测#的问题:大概就是类似后台自动检测某下架商品的库存,在他监测到该商品上架并且可以购买的瞬间点击立即购买下单
  • ¥15 神经网络怎么把隐含层变量融合到损失函数中?
  • ¥15 lingo18勾选global solver求解使用的算法
  • ¥15 全部备份安卓app数据包括密码,可以复制到另一手机上运行
  • ¥20 测距传感器数据手册i2c
  • ¥15 RPA正常跑,cmd输入cookies跑不出来
  • ¥15 求帮我调试一下freefem代码
  • ¥15 matlab代码解决,怎么运行