bytedeco/javacv

ffmpeg audio out of sync and error at end of run

Open

#128 opened on Apr 17, 2015

View on GitHub
 (34 comments) (0 reactions) (0 assignees)Java (1,583 forks)batch import
enhancementhelp wanted

Repository metrics

Stars
 (6,985 stars)
PR merge metrics
 (No merged PRs in 30d)

Description

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();

Contributor guide