bytedeco/javacv

ffmpeg audio out of sync and error at end of run

Open

#128 建立於 2015年4月17日

在 GitHub 查看
 (34 留言) (0 反應) (0 負責人)Java (1,583 fork)batch import
enhancementhelp wanted

倉庫指標

Star
 (6,985 star)
PR 合併指標
 (30 天內沒有已合併 PR)

描述

I have an issue where the audio gets out of sync with the video farther into the video. I have tried many different things to try and fix it and I am at a loss. Anyone that can help I would appreciate it

JAVA- java version "1.8.0_25" Java(TM) SE Runtime Environment (build 1.8.0_25-b17) Java HotSpot(TM) 64-Bit Server VM (build 25.25-b02, mixed mode)

FFMPEG- ffmpeg version 2.4.1 Copyright (c) 2000-2014 the FFmpeg developers built on Sep 23 2014 08:09:44 with llvm-gcc 4.2.1 (LLVM build 2336.11.00)

Here is the error I get at the end of the process:

[h264 @ 0x7ff6c4236000] error while decoding MB 25 31, bytestream -18
[h264 @ 0x7ff6c4236000] Cannot use next picture in error concealment
[h264 @ 0x7ff6c4236000] concealing 1144 DC, 1144 AC, 1144 MV errors in P frame

Here is the code use: As you can see I have tried many different things, moved things around, played with diff settings, etc.

The command line ffmpeg example is: command line uses the following switches without any issue at all.

                     "-i", url,
                     "-bsf:a", "aac_adtstoasc",
                     "-vcodec", "copy",
                     "-c", "copy",

HLS is the HTTP Address


                 FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(HLS);
                    grabber.start();

                    //grabber.setTimestamp((1 * 60 + 30) * 1000000);
                    FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(output, grabber.getAudioChannels());
                    recorder.setFrameRate(grabber.getFrameRate());

                    recorder.setFormat("mp4");

                    recorder.setImageHeight(grabber.getImageHeight());
                    recorder.setImageWidth(grabber.getImageWidth());

                    recorder.setSampleRate(grabber.getSampleRate());
                    recorder.setVideoBitrate(grabber.getVideoBitrate());
                    //recorder.setInterleaved(false);
                    recorder.setVideoCodec(AV_CODEC_ID_H264);
                    //recorder.setVideoCodecName("x264");

                    recorder.setAudioCodec(grabber.getAudioCodec());
                    recorder.setAudioBitrate(grabber.getAudioBitrate());
                    recorder.setAudioChannels(grabber.getAudioChannels());

                    /*
                     command line        
                     "-i", url,
                     "-bsf:a", "aac_adtstoasc",
                     "-vcodec", "copy",
                     "-c", "copy"
                     */
                    // recorder.setAudioOption("async", "50");
                    //av_bitstream_filter_init("aac_adtstoasc");

                    recorder.setVideoOption("preset", "ultrafast");
                    recorder.setVideoOption("c", "copy");

                    recorder.setVideoCodecName("H.264");
                    recorder.setAudioCodecName("copy");
                    recorder.setAudioOption("bsf:a", "aac_adtstoasc");

                    recorder.setAudioOption("desync", "10");
                    //recorder.setVideoOption("skip_frame", "nokey");
                    //recorder.setVideoOption("qpmax", "51");
                    //recorder.setVideoOption("qpmin", "10");
                    recorder.setVideoOption("audio-sync", "");
                    //recorder.setVideoOption("bframes", "16");
                    //recorder.setVideoOption("keyint_min", "25");
                    //recorder.setVideoOption("keyint", "25");

                    //-skip_frame -nokey 
                    // org.bytedeco.javacpp.avformat.
                    //recorder.setAudioQuality();
                    // recorder.setInterleaved(false);
                    //recorder.setAudioCodec(org.bytedeco.javacpp.avcodec.AV_CODEC_ID_AAC  );//aac_adtstoasc
                    //   recorder.setPixelFormat(avutil.);
                  recorder.setVideoOption("threads", "1");
                    recorder.start();
                    recorder.setPixelFormat(grabber.getPixelFormat());

                    recorder.setTimestamp(grabber.getTimestamp());


                    Frame frame;
                    int allFrames = grabber.getLengthInFrames();

                    float percentage = 0;
                    float lastpercentage = 1;
                    System.out.println("Total frames to process " + grabber.getLengthInFrames());
                    //recorder.setFrameRate();
                    System.out.println("Start Frame = " + grabber.getFrameNumber());
                    while ((frame = grabber.grab()) != null) {
                        recorder.record(frame);
                        // Testing
                        recorder.setSampleRate(grabber.getSampleRate());
                        recorder.setVideoBitrate(grabber.getVideoBitrate());
                        recorder.setAudioBitrate(grabber.getAudioBitrate());
                        recorder.setAudioChannels(grabber.getAudioChannels());
                        recorder.setFrameRate(grabber.getFrameRate());
                        // End Testing

                        percentage = ((float) grabber.getFrameNumber() * 100) / allFrames;
                        if (!String.format("%.0f%%", percentage).equals(String.format("%.0f%%", lastpercentage))) {
                            System.out.println("Percentage Complete " + String.format("%.0f%%", percentage) + "\r");
                            lastpercentage = percentage;
                           }


                    }

                    recorder.stop();
                    recorder.release();
                    grabber.stop();
                    grabber.release();

貢獻者指南