跳转至内容
  • 社区首页
  • 版块
  • 最新
  • 标签
  • 热门
折叠

GitHub中文论坛

  1. 主页
  2. 版块
  3. 技术交流
  4. javacv + srs 录制rtmp流报异常 avcodec_send_frame() error -541478725

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

已定时 已固定 已锁定 已移动 技术交流
流媒体
5 帖子 2 发布者 683 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
回复
  • 在新帖中回复
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • YcyQY 离线
    YcyQY 离线
    YcyQ
    写于 最后由 YcyQ 编辑
    #1

    用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
    • YcyQY 离线
      YcyQY 离线
      YcyQ
      写于 最后由 YcyQ 编辑
      #2

      最后搞了好久,发现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
      • 10166866561 离线
        10166866561 离线
        1016686656
        写于 最后由 编辑
        #3

        可以教教我建立网站吗?

        YcyQY 1 条回复 最后回复
        0
        • 10166866561 1016686656

          可以教教我建立网站吗?

          YcyQY 离线
          YcyQY 离线
          YcyQ
          写于 最后由 编辑
          #4

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

          10166866561 1 条回复 最后回复
          0
          • YcyQY YcyQ

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

            10166866561 离线
            10166866561 离线
            1016686656
            写于 最后由 编辑
            #5

            @ycyq LNMP

            1 条回复 最后回复
            0
            回复
            • 在新帖中回复
            登录后回复
            • 从旧到新
            • 从新到旧
            • 最多赞同


            • 登录

            • 第一个帖子
              最后一个帖子
            0
            • 社区首页
            • 版块
            • 最新
            • 标签
            • 热门