我的需求是验证Java能否实现将已有的RTSP流A转为RTSP流B。

可以的,需要引入这个版本的javacv(老板会报直接错,用这个版本能播放个10来秒才报错,不过我解决标题这个问题后就没问题了)

这个错误的意思是当前包的编译时间戳(DTS)比上一次的DTS小,然后ffmpeg不允许这种情况,所以就报错了。

解决办法就是当出现这种情况时,让当前包的dts 赋值为 上一次dts+1,保证比上一次dts大就行了。

<dependency><groupId>org.bytedeco</groupId><artifactId>javacv-platform</artifactId><version>1.5.9</version></dependency>

关键代码为:

if (packet.pts() == AV_NOPTS_VALUE) {if (packet.dts() != AV_NOPTS_VALUE) {packet.pts(packet.dts());lastDTS = packet.dts();} else {packet.pts(lastDTS + 1);packet.dts(packet.pts());lastDTS = packet.pts();}} else {if (packet.dts() != AV_NOPTS_VALUE) {if (packet.dts() < lastDTS) {packet.dts(lastDTS + 1);}lastDTS = packet.dts();} else {packet.dts(packet.pts());lastDTS = packet.dts();}}

完整的代码为:

package org.jfjy.ecctv.core.jtr;import org.bytedeco.ffmpeg.avcodec.AVPacket;
import org.bytedeco.ffmpeg.avformat.AVFormatContext;
import org.bytedeco.ffmpeg.global.avcodec;
import org.bytedeco.ffmpeg.global.avformat;
import org.bytedeco.ffmpeg.global.avutil;
import org.bytedeco.javacv.*;import java.text.SimpleDateFormat;import static org.bytedeco.ffmpeg.global.avutil.AV_NOPTS_VALUE;/*** RTSP转RTMP** @author zhout*/
public class RTSPToRTMPWithAVPacket {private static final int RECORD_LENGTH = 5000;private static final boolean AUDIO_ENABLED = false;public static void main(String[] args) throws FrameRecorder.Exception, FrameGrabber.Exception {avutil.av_log_set_level(avutil.AV_LOG_DEBUG);FFmpegLogCallback.set();String inputFile = "rtsp://127.0.0.1:8554/live";//String inputFile = "D:\\cData\\rtsp\\orange.mp4";/*        // Decodes-encodesString outputFile = "/tmp/" + DATE_FORMAT.format(new Date()) + "_frameRecord.mp4";RTSPToRTMPWithAVPacket.frameRecord(inputFile, outputFile);*/// copies codec (no need to re-encode)//String outputFile = "/tmp/" + DATE_FORMAT.format(new Date()) + "_packetRecord.mp4";String outputFile = "rtsp://127.0.0.1:8554/live2";RTSPToRTMPWithAVPacket.packetRecord(inputFile, outputFile);}public static void frameRecord(String inputFile, String outputFile) throws FrameGrabber.Exception, FrameRecorder.Exception {int audioChannel = AUDIO_ENABLED ? 1 : 0;FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(inputFile);FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(outputFile, 1280, 720, audioChannel);grabber.start();recorder.start();Frame frame;long t1 = System.currentTimeMillis();while ((frame = grabber.grabFrame(AUDIO_ENABLED, true, true, false)) != null) {recorder.record(frame);if ((System.currentTimeMillis() - t1) > RECORD_LENGTH) {break;}}recorder.stop();grabber.stop();}public static void packetRecord(String inputFile, String outputFile) throws FrameGrabber.Exception, FrameRecorder.Exception {int audioChannel = AUDIO_ENABLED ? 1 : 0;FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(inputFile);FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(outputFile, 600, 400, audioChannel);grabber.start();recorder.setInterleaved(true);recorder.setVideoOption("tune", "zerolatency");recorder.setVideoOption("preset", "ultrafast");recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);recorder.setFormat("rtsp");System.out.println("grabber.getFrameRate():" + grabber.getFrameRate());recorder.setFrameRate(grabber.getFrameRate());recorder.setGopSize((int) grabber.getFrameRate() * 2);AVFormatContext formatContext = grabber.getFormatContext();formatContext.max_interleave_delta(0);formatContext.flags(avformat.AVFMT_TS_NONSTRICT);recorder.setTimestamp(0);recorder.start(formatContext);AVPacket packet;long startTime = System.currentTimeMillis();long videoTS = 0;long lastDTS = 0;while ((packet = grabber.grabPacket()) != null) {if (packet.pts() == AV_NOPTS_VALUE) {if (packet.dts() != AV_NOPTS_VALUE) {packet.pts(packet.dts());lastDTS = packet.dts();} else {packet.pts(lastDTS + 1);packet.dts(packet.pts());lastDTS = packet.pts();}} else {if (packet.dts() != AV_NOPTS_VALUE) {if (packet.dts() < lastDTS) {packet.dts(lastDTS + 1);}lastDTS = packet.dts();} else {packet.dts(packet.pts());lastDTS = packet.dts();}}if (packet.pts() < packet.dts()) {packet.pts(packet.dts());}videoTS = 1000 * (System.currentTimeMillis() - startTime);if (videoTS < 0 || packet.dts() < 0 || packet.pts() < 0) {continue;}// Check for AV driftSystem.out.println("videots:%d; recorder timestamp:%d".formatted(videoTS, recorder.getTimestamp()));if (videoTS > recorder.getTimestamp()) {System.out.println("Lip-flap correction: "+ videoTS + " : "+ recorder.getTimestamp() + " -> "+ (videoTS - recorder.getTimestamp()));// We tell the recorder to write this frame at this timestamprecorder.setTimestamp(videoTS);}recorder.recordPacket(packet);}recorder.stop();grabber.stop();}}

[Java] Application provided invalid, non monotonically increasing dts to muxer in stream 0相关推荐

  1. Application provided invalid, non monotonically increasing dts to muxer in stream 0: -92233720368547

    编码时发生了 Application provided invalid, non monotonically increasing dts to muxer in stream 0: -9223372 ...

  2. guns java_关于guns采用java application启动报错问题

    源自:1-5 eclipse部署和启动guns 关于guns采用java application启动报错问题 eclipse配置的jdk是9.0.4版本的,可是在项目中查看是1.8版本的,启动的时候报 ...

  3. Error parsing HTTP request header...java.lang.IllegalArgumentException: Invalid character found in m

    问题描述 http请求,偶尔出现该问题. 2022-04-09 09:28:36,247 INFO [][scheduling-1] c.w.w.task.ApiRequestTask - refre ...

  4. java.lang.IllegalArgumentException: Invalid token /storage/emulated/0/Download/s-kz-02.jpg

    一.前言 在Android12版本上面使用MediaStore时候有时候会遇到以下错误: java.lang.IllegalArgumentException: Invalid token /stor ...

  5. Caused by: java.lang.IllegalArgumentException: Invalid <url-pattern> [url] in servlet mapping

    使用SSM框架的时候我测试springmvc的时候遇到的错误: 一.Server Tomcat v9.0 Server at localhost failed to start. 启动Tomcat服务 ...

  6. Error:Java home supplied via 'org.gradle.java.home' is invalid

    我的java home都有,Java 配置的都是对的.但是他就告诉我 Error:Java home supplied via 'org.gradle.java.home' is invalid. I ...

  7. Java打包问题之一:打包出现java.io.IOException: invalid header field

    前言 java的打包工具jar有时候会出一些莫名其妙的问题,比如不合法的头部字段等等.这些问题之前也没注意,因为一直是用eclipse打包.后来在公司的时候,要求统一编写shell脚本来进行打包. 其 ...

  8. java.io.StreamCorruptedException: invalid stream header: EFBFBDEF 问题解决

    java.io.StreamCorruptedException: invalid stream header: EFBFBDEF 问题解决 参考文章: (1)java.io.StreamCorrup ...

  9. java.lang.RuntimeException: Invalid action class configuration that references an unknown class name

    java.lang.RuntimeException: Invalid action class configuration that references an unknown class name ...

最新文章

  1. python操作文件的笔记
  2. hibernate3 hbm2java_hibernate3下hbm2ddl和hbm2java的配置
  3. python中使用pickle进行序列化
  4. 从Java应用程序中消除Null指针异常
  5. seo专题之开篇有益
  6. “附近的小程序”可以直接找“餐饮” 非管理员也能登录小程序了
  7. 给 IDEA 换个酷炫的主题吧,这个有点哇塞啊!
  8. 电子书格式转换方法集锦
  9. Workbench网格分块分区划分 扫面、节点控制网格数的应用
  10. python_误差分析
  11. 牛客多校第九场K-The Flee Plan of Groundhog(树形DP)
  12. pyscripter支持python什么版本_PyScripter下载|PyScripter(Python集成开发环境) v2.6.0官方版 64位/32位 - 121下载站...
  13. 【小工具】- Ubuntu如何查看cpu支持的指令集
  14. 公司要收我的毕业证书,这合法吗
  15. 动态规划----最长公共子序列问题
  16. iOS启动速度优化实践分享
  17. “神秘的”0day漏洞
  18. 怎样用cmd创建Windows计划任务
  19. google为何选择kotlin?kotlin如何解决java开发痛点【续】?
  20. 日尺度气象干旱指标:SAPEI

热门文章

  1. Strange Towers of Hanoi 汉诺塔问题及其升级(递推)四个汉诺塔问题
  2. Opencv 如何精简包(JAVA)
  3. 在linux系统中自定义协议,让浏览器可以调用本地程序
  4. vSAN实践经验-07: vSAN的监控和告警
  5. nginx proxy_redirect 作用
  6. php backlog,backlog参数对TCP连接建立的影响
  7. 力扣1089 的本手妙手俗手
  8. win10预览窗格无法预览office解决方案
  9. 汽车油箱冲压工艺优化
  10. HTML框架结构标签(frameset)