package org.dromara.system.utils;


import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Utils {




    public static List<Integer> random(int baseNum, int length) {
        List<Integer> list = new ArrayList<>(length);
        while (list.size() < length) {
            Integer next = (int) (Math.random() * baseNum);
            if (list.contains(next)) {
                continue;
            }
            list.add(next);
        }
        Collections.sort(list);
        return list;
    }
    public static  boolean exchangeToMp4(String ffmpegPath, String upFilePath, String codcFilePath) throws Exception {
        // 创建List集合来保存转换视频文件为flv格式的命令
        List<String> convert = new ArrayList<String>();
        convert.add(ffmpegPath); // 添加转换工具路径
        convert.add("-y"); // 该参数指定将覆盖已存在的文件
        convert.add("-i");
        convert.add(upFilePath);
        convert.add("-c:v");
        convert.add("libx264");
        convert.add("-c:a");
        convert.add("aac");
        convert.add("-strict");
        convert.add("-2");
        convert.add("-pix_fmt");
        convert.add("yuv420p");
        convert.add("-movflags");
        convert.add("faststart");
        // convert.add("-vf"); // 添加水印
        // convert.add("movie=watermark.gif[wm];[in][wm]overlay=20:20[out]");
        convert.add(codcFilePath);

        boolean mark = true;

        try {
            Process videoProcess = new ProcessBuilder(convert).redirectErrorStream(true).start();
            new PrintStream(videoProcess.getInputStream()).start();
            videoProcess.waitFor(); // 加上这句，系统会等待转换完成。不加，就会在服务器后台自行转换。

        } catch (Exception e) {
            mark = false;
            System.out.println(e);
            e.printStackTrace();
        }
        return mark;
    }

    public static class PrintStream extends Thread {
        java.io.InputStream __is = null;

        public PrintStream(java.io.InputStream is) {
            __is = is;
        }

        public void run() {
            try {
                while (this != null) {
                    int _ch = __is.read();
                    if (_ch != -1)
                        System.out.print((char) _ch);
                    else
                        break;
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * @param input  可以是一个InputStream的流、动态图片(apng,gif等等)，视频文件（mp4,flv,avi等等）,流媒体地址（http-flv,rtmp，rtsp等等）
     * @param output hls切片存放地址
     * @throws org.bytedeco.javacv.FrameGrabber.Exception
     * @throws org.bytedeco.javacv.FrameRecorder.Exception
     * @Title: push
     * @Description: hls切片
     * @return: void
     **/
    public static PrintStream push(String ffmpegpath, String input, String output) {
//                 public boolean exchangeToMp4(String ffmpegPath, String upFilePath, String codcFilePath) throws Exception {
        // 创建List集合来保存转换视频文件为flv格式的命令
        List<String> convert = new ArrayList<String>();
        convert.add(ffmpegpath); // 添加转换工具路径
        convert.add("-y"); // 该参数指定将覆盖已存在的文件
        convert.add("-i");
        convert.add(input);
        convert.add("-vcodec");
        convert.add("copy");
        convert.add("-acodec");
        convert.add("copy");
        convert.add("-c:a");
        convert.add("aac");
        convert.add("-vbsf");
        convert.add("h264_mp4toannexb");
        convert.add("-f");
        convert.add("hls");
        convert.add("-hls_list_size");
        convert.add("5");
        convert.add("-hls_time");
        convert.add("10");
//        convert.add("-hls_wrap");
//        convert.add("6");

        // convert.add("-vf"); // 添加水印
        // convert.add("movie=watermark.gif[wm];[in][wm]overlay=20:20[out]");
        convert.add(output);

        boolean mark = true;

        try {
            Process videoProcess = new ProcessBuilder(convert).redirectErrorStream(true).start();

            PrintStream p = new PrintStream(videoProcess.getInputStream());
            p.start();
            return p;
//                     videoProcess.waitFor(); // 加上这句，系统会等待转换完成。不加，就会在服务器后台自行转换。

        } catch (Exception e) {
            mark = false;
            System.out.println(e);
            e.printStackTrace();
        }
        return null;
    }



//    public static void main(String[] args) {
//        try {
//                Utils.cropMp4("/Users/wenhongquan/Downloads/aliyunmedia.mp4", 0, 22,"/Users/wenhongquan/Desktop/tmp/aa.mp4");
//                Utils.GrabberFistFFmpegImage("/Users/wenhongquan/Desktop/tmp/aa.mp4","/Users/wenhongquan/Desktop/tmp/","aa");
//                Utils.GrabberFistFFmpegImage("/Users/wenhongquan/Downloads/aliyunmedia.mp4","/Users/wenhongquan/Desktop/tmp/","pp",15);

//            Utils sUtils = new Utils();

//            sUtils.exchangeToMp4("/Users/wenhongquan/miniforge3/bin/ffmpeg", "/Users/wenhongquan/Downloads/demo/target/classes/temp/1.mp4", "/Users/wenhongquan/Downloads/demo/target/classes/temp/3.mp4");
//			Utils.ConvertVideo("/Users/wenhongquan/Downloads/demo/target/classes/temp/1.mp4");

//        } catch (Exception e) {
//
//        }
//    }

}
