论坛

    • 登录
    • 版块
    • 最新
    • 标签
    • 热门

    javacv + srs 录制rtmp流报异常 avcodec_send_frame() error -541478725

    技术交流
    流媒体
    2
    5
    291
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • YcyQ
      YcyQ 最后由 YcyQ 编辑

      用SRS搭建一个流媒体服务器。然后使用javacv 的 FFmpegFrameGrabber 从SRS上拉流 ,并使用FFmpegFrameRecorder 录制mp4。代码如下:

      FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(srcUri);
      grabber.setOption("threads", "1");
      // 设置缓存大小,提高画质、减少卡顿花屏
      grabber.setOption("buffer_size", "1024000");
      // 读写超时,适用于所有协议的通用读写超时
      grabber.setOption("rw_timeout", "15000000");
      // 探测视频流信息,为空默认5000000微秒
      grabber.setOption("probesize","15000000");
      // 解析视频流信息,为空默认5000000微秒
      grabber.setOption("analyzeduration", "15000000");
      // rtmp拉流缓冲区,默认3000毫秒
      grabber.setOption("rtmp_buffer", "1000");
      
      
      
      String outputVideoUrl = "d:\\out.mp4";
      new FFmpegFrameRecorder(outputVideoUrl, grabber.getImageWidth(),grabber.getImageHeight(),
                      grabber.getAudioChannels());
      
      recorder.start();
      
      Frame frame;
      // 录制10秒视频
      int duration = 10 * 1000 * 1000;
      long start = grabber.getTimestamp()
      while((frame = grabber.grab()) != null){
        if(grabber.getTimestamp() - start > duration) {
            break;
        }
        recorder.record(frame);
      }
      
      

      但是当读到图片帧的时候会报下面的错误

      org.bytedeco.javacv.FFmpegFrameRecorder$Exception: avcodec_send_frame() error -541478725: Error sending a video frame for encoding.
      

      奇怪的很。用其他流媒体服务器,node-media-server 就不报错

      1 条回复 最后回复 回复 引用 0
      • YcyQ
        YcyQ 最后由 YcyQ 编辑

        最后搞了好久,发现SRS拉过来的流含有类型为Data的帧。

        Stream #0:0: Data: none
        Stream #0:1: Audio: aac (LC), 48000 Hz, stereo, fltp, 163 kb/s
        Stream #0:2: Video: h264 (High), yuv420p(tv, bt709, progressive), 1920x1080 [SAR 1:1 DAR 16:9], 2560 kb/s, 60 fps, 60 tbr, 1k tbn
        

        这个需要加个判断,record的时候把非音频和图片的帧都过滤掉。

        if(frame.streamIndex != grabber.getVideoStream() 
                    && frame.streamIndex != grabber.getAudioStream()) {
            continue;
        }
        

        完工,奥力给

        1 条回复 最后回复 回复 引用 0
        • 1016686656
          1016686656 最后由 编辑

          可以教教我建立网站吗?

          YcyQ 1 条回复 最后回复 回复 引用 0
          • YcyQ
            YcyQ @1016686656 最后由 编辑

            @1016686656 你要建什么网站。简单的话,wordpress了解下

            1016686656 1 条回复 最后回复 回复 引用 0
            • 1016686656
              1016686656 @YcyQ 最后由 编辑

              @ycyq LNMP

              1 条回复 最后回复 回复 引用 0
              • First post
                Last post