Когда я пытаюсь удалить избыточный файл даже после закрытия всех ссылок, jvm создает исключение FileSystemException - PullRequest
0 голосов
/ 07 мая 2018

Я создаю файл видеозаписи (avi) с javacv после создания, преобразовывая этот файл в файл mp4 с Jaffree . Когда я пытаюсь удалить ненужный теперь avi-файл, он выдает исключение FileSystemException.

Я уже выпустил все файлы, содержащие Объекты, но все равно создается исключение. Также попытался принудительно удалить apache common io FileUtils.forceDelete(sample.getFile()); с тем же исключением.


public class PacketRecorderTest {

private static final DateFormat DATE_FORMAT = new SimpleDateFormat("yyyyMMdd__hhmmSSS");
private static final int RECORD_LENGTH = 10000;
private static final boolean AUDIO_ENABLED = false;
static String inputFile =  "rtsp://184.72.239.149/vod/mp4:BigBuckBunny_115k.mov";
static String outputFile = "C:\\Users\\team3\\Desktop\\User\\Vinay\\javacppffmpeg\\frame.avi";

public static void main(String[] args) throws FrameRecorder.Exception, FrameGrabber.Exception, InterruptedException{
    packetRecord(inputFile,outputFile);
    jafreeToMp4(outputFile, "C:\\Users\\team3\\Desktop\\User\\Vinay\\javacppffmpeg\\frame.mp4");
    try {
        Files.delete(Paths.get(outputFile));
    } catch (IOException e) {
        e.printStackTrace();
    }
}

public static void packetRecord(String inputFile, String outputFile) throws FrameGrabber.Exception, FrameRecorder.Exception {

    FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(inputFile);
    grabber.start();
    FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(
            outputFile,
            1280,
            720);
    recorder.start(grabber.getFormatContext());
    recorder.setFormat("avi");
    recorder.setPixelFormat(AV_PIX_FMT_YUV420P);
    recorder.setVideoOption("crf", "22");
    recorder.setVideoQuality(0);
    recorder.setFrameRate(15);
    recorder.start();

    avcodec.AVPacket packet;
    long t1 = System.currentTimeMillis();
    while ((packet = grabber.grabPacket()) != null) {
            recorder.recordPacket(packet);
            if ((System.currentTimeMillis() - t1) > RECORD_LENGTH) {
                break;
            }
    }
    grabber.stop();
    recorder.stop();
    recorder.release();
    grabber.release();

}


public static void jafreeToMp4 (String inputFile, String outputFile) {
    Path BIN = Paths.get("C:\\ffmpeg\\shared\\bin");
    Path VIDEO_MP4 = Paths.get(inputFile);
    Path OUTPUT_MP4 = Paths.get(outputFile);

    FFmpegResult result = FFmpeg.atPath(BIN)
            .addInput(UrlInput.fromPath(VIDEO_MP4))
            .addOutput(UrlOutput.toPath(OUTPUT_MP4)
            )
            .execute();
}

}


java.nio.file.FileSystemException: C: \ Users \ team3 \ Desktop \ User \ Vinay \ javacppffmpeg \ frame.avi: процесс не может получить доступ к файлу, поскольку он используется другим процессом.

at sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:86)
at sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:97)
at sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:102)
at sun.nio.fs.WindowsFileSystemProvider.implDelete(WindowsFileSystemProvider.java:269)
at sun.nio.fs.AbstractFileSystemProvider.delete(AbstractFileSystemProvider.java:103)
at java.nio.file.Files.delete(Files.java:1126)
at playground.PacketRecorderTest.main(PacketRecorderTest.java:39)

Ответы [ 2 ]

0 голосов
/ 08 мая 2018

Дважды вызывал метод start () recorder.start(grabber.getFormatContext()); и start(). Так что, возможно, первый звонок мог оставить ссылки не отслеженными.

0 голосов
/ 07 мая 2018

Не могу сказать точно, поскольку у меня нет немедленного доступа к библиотекам, которые вы используете.Тем не менее, мне кажется, что у вас все еще есть открытые InputStreams и OutputStreams.Мои предложения будут выглядеть примерно так, в зависимости от типа возвращаемого значения вспомогательных методов:

try(InputStream in = UrlInput.fromPath(VIDEO_MP4);
    OutputStream out = UrlOutput.toPath(OUTPUT_MP4)) {

    FFmpegResult result = FFmpeg.atPath(BIN)
        .addInput(in)
        .addOutput(out)
        .execute();
}

Это закроет ресурсы после завершения оператора.

...