bytedeco/javacv

av_write_frame() error -10053 while writing video packet.

Open

#1 541 ouverte le 2 déc. 2020

Voir sur GitHub
 (2 commentaires) (0 réactions) (0 assignés)Java (1 583 forks)batch import
help wantedquestion

Métriques du dépôt

Stars
 (6 985 stars)
Métriques de merge PR
 (Aucune PR mergée en 30 j)

Description

hello: I am using pipeinputstream to convert H264 data to FLV,When I pause, use the following code to keep the loop going。

 // pause sign
 if (playstatus) {
        Thread.sleep(100);
        continue;
 }

When I continue playing, an error occurs when I loop to get the pkt and call the recordpacket function. This is an error message:

org.bytedeco.javacv.FrameRecorder$Exception: av_write_frame() error -10053 while writing video packet.
[2020-12-02 10:38:34.447] [pool-1-thread-1] [ERROR] [com.junction.play.RtmpPush] : av_write_frame() error -10053 while writing video packet.
	at org.bytedeco.javacv.FFmpegFrameRecorder.writePacket(FFmpegFrameRecorder.java:1257)
	at org.bytedeco.javacv.FFmpegFrameRecorder.recordPacket(FFmpegFrameRecorder.java:1292)
	at com.junction.play.RtmpPush.push(RtmpPush.java:238)
	at com.junction.play.RealPlay.play(RealPlay.java:99)
	at com.junction.thread.CameraThread$MyRunnable.run(CameraThread.java:45)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at java.lang.Thread.run(Thread.java:748)
Warning: [flv @ 0000000026c20200] Failed to update header with correct duration.

Warning: [flv @ 0000000026c20200] Failed to update header with correct filesize.

Here is my code, hope to get your help, thank you very much!!

FFmpegLogCallback.set();
grabber = new FFmpegFrameGrabber(inputStream, 0);
grabber.setVideoOption("vcodec", "copy");
grabber.setFormat("mpeg");
grabber.setPixelFormat(avutil.AV_PIX_FMT_YUV420P);
grabber.setVideoCodec(avcodec.AV_CODEC_ID_H264);
grabber.setAudioStream(Integer.MAX_VALUE);
grabber.start();

recorder = new FFmpegFrameRecorder(pojo.getRtmp(), grabber.getImageWidth(), grabber.getImageHeight(),
					0);
recorder.setInterleaved(true);
recorder.setVideoOptions(this.videoOption);
recorder.setVideoBitrate(bitrate);
recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);
recorder.setFormat("flv");
recorder.setPixelFormat(avutil.AV_PIX_FMT_YUV420P);
recorder.setFrameRate(framerate);
recorder.setGopSize((int) framerate);
AVFormatContext fc = null;
AVPacket pkt = null;
long lasttime = System.currentTimeMillis();
int pktindex = 0;
for (int no_pkt_index = 0; no_pkt_index < 5 && err_index < 5;) {
	long time11 = System.currentTimeMillis();
	// 中断推流任务开关
	if (exitcode == 1) {
		break;
	}
	// pause sign
	if (playstatus) {
		Thread.sleep(100);
		continue;
	}
	pkt = grabber.grabPacket();
	if (pkt == null || pkt.size() <= 0 || pkt.data() == null) {
		no_pkt_index++;
		continue;
	}
	if (pkt.dts() == avutil.AV_NOPTS_VALUE && pkt.pts() == avutil.AV_NOPTS_VALUE || pkt.pts() < dts) {
		err_index++;
		av_packet_unref(pkt);
		continue;
	}
	if (pkt.stream_index() == 1) {
		av_packet_unref(pkt);
		continue;
	} else {
		pkt.pts(pts);
		pkt.dts(dts);
		err_index += (recorder.recordPacket(pkt) ? 0 : 1);
		pktindex++;
		if (pktindex >= framerate * speed) {
			long nowtime = System.currentTimeMillis();
			if (nowtime - lasttime < 1000) {
				Thread.sleep(1000 - (nowtime - lasttime));
			}
			lasttime = System.currentTimeMillis();
			pktindex = 0;
		}
	}
	// pts,dts累加
	timebase = grabber.getFormatContext().streams(pkt.stream_index()).time_base().den();
	pts += (timebase / (int) framerate) / speed;
	dts += (timebase / (int) framerate) / speed;
	av_packet_unref(pkt);
}

Guide contributeur