bytedeco / javacv

Java interface to OpenCV, FFmpeg, and more
Other
7.39k stars 1.56k forks source link

FFmpegFrameRecorder$Exception: avformat_write_header error() error -22: Could not write header (How to fix this, help) #2125

Open ZhangTeng2017 opened 7 months ago

ZhangTeng2017 commented 7 months ago

public static void video2Webp(String localVideoPath, String localWebpPath) { try(FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(localVideoPath); FFmpegFrameFilter filter = new FFmpegFrameFilter("scale=iw/2:ih/2", grabber.getImageWidth() / 2, grabber.getImageHeight() / 2)) { grabber.start(); filter.setAudioChannels(1); filter.setSampleFormat(grabber.getSampleFormat()); filter.setSampleRate(grabber.getSampleRate()); filter.start();

        FFmpegFrameRecorder recorder = FFmpegFrameRecorder.createDefault(localWebpPath, grabber.getImageWidth()/2, grabber.getImageHeight()/2);
        recorder.setFrameRate(30);
        recorder.setAudioChannels(1);
        recorder.setVideoCodec(avcodec.AV_CODEC_ID_WEBP);
        recorder.setAudioCodec(avcodec.AV_CODEC_ID_AAC);
        recorder.setAudioOption("an", "1");
        recorder.start();
        Frame in, out;
        while ((in = grabber.grab()) != null) {
            filter.push(in);
            while ((out = filter.pull()) != null) {
                recorder.record(out);
            }
        }

        recorder.stop();
        filter.stop();
        grabber.stop();

    } catch (Exception e) {
        e.printStackTrace();
    }
}

public static void main(String[] args) {
    String inputFile = "/Users/terryzhang/IdeaProjects/code/media-morph/1.MP4"; // 输入视频文件路径
    String outputFile = "/Users/terryzhang/IdeaProjects/code/media-morph/1.webp"; // 输出GIF文件路径
    video2Webp(inputFile, outputFile);
}

while the error:

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/Users/terryzhang/IdeaProjects/code/media-morph/1.MP4': Metadata: major_brand : mp42 minor_version : 1 compatible_brands: isommp41mp42 creation_time : 2021-05-03T08:01:21.000000Z Duration: 00:00:04.84, start: 0.000000, bitrate: 1231 kb/s Stream #0:00x1: Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709, progressive), 960x544, 1175 kb/s, 29.14 fps, 29.97 tbr, 600 tbn (default) Metadata: creation_time : 2021-05-03T08:01:21.000000Z handler_name : Core Media Video vendor_id : [0][0][0][0] Stream #0:10x2: Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, mono, fltp, 49 kb/s (default) Metadata: creation_time : 2021-05-03T08:01:21.000000Z handler_name : Core Media Audio vendor_id : [0][0][0][0] [webp @ 0x7fa083b9b0c0] Only exactly 1 stream is supported [aac @ 0x7fa082710c80] Qavg: nan org.bytedeco.javacv.FFmpegFrameRecorder$Exception: avformat_write_header error() error -22: Could not write header to '/Users/terryzhang/IdeaProjects/code/media-morph/1.webp' (For more details, make sure FFmpegLogCallback.set() has been called.) at org.bytedeco.javacv.FFmpegFrameRecorder.startUnsafe(FFmpegFrameRecorder.java:969) at org.bytedeco.javacv.FFmpegFrameRecorder.start(FFmpegFrameRecorder.java:437) at com.xx.mediamorph.service.SnapService.video2Webp(SnapService.java:28) at com.xx.mediamorph.service.SnapService.main(SnapService.java:49)

Process finished with exit code 0

saudet commented 5 months ago

Please make sure that FFmpegLogCallback.set() has been called.