| @@ -94,6 +94,12 @@ | |||
| set `status` = #{status}, | |||
| <if test=" null != failRemark and '' != failRemark"> | |||
| `fail_remark` = #{failRemark}, | |||
| </if> | |||
| <if test=" null != audioRemark and '' != audioRemark"> | |||
| `audio_remark` = #{audioRemark}, | |||
| </if> | |||
| <if test=" null != audioDate and '' != audioDate"> | |||
| `audio_date` = #{audioDate}, | |||
| </if> | |||
| `update_date` = #{updateDate} | |||
| where id=#{id} | |||
| @@ -12,7 +12,36 @@ | |||
| <artifactId>mallinkVideo</artifactId> | |||
| <dependencies> | |||
| <dependency> | |||
| <groupId>com.aliyun</groupId> | |||
| <artifactId>aliyun-java-sdk-core</artifactId> | |||
| <version>4.5.1</version> | |||
| </dependency> | |||
| <dependency> | |||
| <groupId>com.aliyun.oss</groupId> | |||
| <artifactId>aliyun-sdk-oss</artifactId> | |||
| <version>3.10.2</version> | |||
| </dependency> | |||
| <dependency> | |||
| <groupId>com.aliyun</groupId> | |||
| <artifactId>aliyun-java-sdk-vod</artifactId> | |||
| <version>2.15.11</version> | |||
| </dependency> | |||
| <dependency> | |||
| <groupId>com.alibaba</groupId> | |||
| <artifactId>fastjson</artifactId> | |||
| <version>1.2.28</version> | |||
| </dependency> | |||
| <dependency> | |||
| <groupId>org.json</groupId> | |||
| <artifactId>json</artifactId> | |||
| <version>20170516</version> | |||
| </dependency> | |||
| <dependency> | |||
| <groupId>com.google.code.gson</groupId> | |||
| <artifactId>gson</artifactId> | |||
| <version>2.8.2</version> | |||
| </dependency> | |||
| </dependencies> | |||
| </project> | |||
| @@ -1,290 +0,0 @@ | |||
| package com.iformall.ocr; | |||
| import java.io.File; | |||
| import java.io.FileOutputStream; | |||
| import java.io.IOException; | |||
| import java.io.InputStream; | |||
| import java.io.OutputStream; | |||
| import java.net.MalformedURLException; | |||
| import java.net.URISyntaxException; | |||
| import java.net.URL; | |||
| import java.net.URLConnection; | |||
| import com.baomidou.mybatisplus.core.toolkit.IdWorker; | |||
| import com.recognition.software.jdeskew.ImageDeskew; | |||
| import net.sourceforge.tess4j.ITessAPI.TessPageIteratorLevel; | |||
| import net.sourceforge.tess4j.ITesseract; | |||
| import net.sourceforge.tess4j.ITesseract.RenderedFormat; | |||
| import net.sourceforge.tess4j.Tesseract; | |||
| import net.sourceforge.tess4j.Word; | |||
| import net.sourceforge.tess4j.util.ImageHelper; | |||
| import net.sourceforge.tess4j.util.LoggHelper; | |||
| import net.sourceforge.tess4j.util.Utils; | |||
| import org.slf4j.Logger; | |||
| import org.slf4j.LoggerFactory; | |||
| import javax.imageio.ImageIO; | |||
| import java.awt.*; | |||
| import java.awt.image.BufferedImage; | |||
| import java.io.File; | |||
| import java.util.ArrayList; | |||
| import java.util.Arrays; | |||
| import java.util.List; | |||
| /** | |||
| * https://www.cnblogs.com/pejsidney/p/9487881.html | |||
| * Tess4J是对Tesseract OCR API.的Java JNA 封装。使java能够通过调用Tess4J的API来使用Tesseract OCR。支持的格式:TIFF,JPEG,GIF,PNG,BMP,JPEG,and PDF | |||
| Tesseract 的github地址:https://github.com/tesseract-ocr/tesseract | |||
| Tess4J的github地址:https://github.com/nguyenq/tess4j | |||
| Tess4J API 提供的功能: | |||
| 1、直接识别支持的文件 | |||
| 2、识别图片流 | |||
| 3、识别图片的某块区域 | |||
| 4、将识别结果保存为 TEXT/ HOCR/ PDF/ UNLV/ BOX | |||
| 5、通过设置取词的等级,提取识别出来的文字 | |||
| 6、获得每一个识别区域的具体坐标范围 | |||
| 7、调整倾斜的图片 | |||
| 8、裁剪图片 | |||
| 9、调整图片分辨率 | |||
| 10、从粘贴板获得图像 | |||
| 11、克隆一个图像(目的:创建一份一模一样的图片,与原图在操作修改上,不相 互影响) | |||
| 12、图片转换为二进制、黑白图像、灰度图像 | |||
| 13、反转图片颜色 | |||
| * @author alascor | |||
| */ | |||
| public class FormallTess4j { | |||
| private static final Logger logger = LoggerFactory.getLogger(new LoggHelper().toString()); | |||
| static final double MINIMUM_DESKEW_THRESHOLD = 0.05d; | |||
| private static final String datapath = "src/main/resources"; | |||
| private static final String testResourcesLanguagePath = datapath+"/tessdata"; | |||
| private static final String tempfile = "/ocrtempfile/"; | |||
| private static ITesseract instance = new Tesseract(); | |||
| static { | |||
| instance.setDatapath(new File(datapath).getPath()); | |||
| } | |||
| private static File urlImgToFile(String fileUrl) { | |||
| InputStream ins = null; | |||
| OutputStream os = null; | |||
| try { | |||
| URL url = new URL(fileUrl); | |||
| URLConnection c = url.openConnection(); | |||
| ins = c.getInputStream(); | |||
| File folder = new File (tempfile) ; | |||
| if (!folder.exists()) { | |||
| folder.mkdirs(); | |||
| } | |||
| File f = new File(tempfile+System.currentTimeMillis()+"-"+IdWorker.get32UUID()+".jpg"); | |||
| if (f.exists()) { | |||
| f.delete(); | |||
| } | |||
| f.createNewFile(); | |||
| os = new FileOutputStream(f); | |||
| int bytesRead = 0; | |||
| byte[] buffer = new byte[8192]; | |||
| while ((bytesRead = ins.read(buffer, 0, 8192)) != -1) { | |||
| os.write(buffer, 0, bytesRead); | |||
| } | |||
| os.close(); | |||
| ins.close(); | |||
| return f; | |||
| } catch (MalformedURLException e) { | |||
| e.printStackTrace(); | |||
| } catch (IOException e) { | |||
| // TODO Auto-generated catch block | |||
| e.printStackTrace(); | |||
| }finally { | |||
| if (null != os) { | |||
| try { | |||
| os.close(); | |||
| } catch (IOException e) { | |||
| e.printStackTrace(); | |||
| } | |||
| } | |||
| if (null != ins) { | |||
| try { | |||
| ins.close(); | |||
| } catch (IOException e) { | |||
| e.printStackTrace(); | |||
| } | |||
| } | |||
| } | |||
| return null; | |||
| } | |||
| private static void deletetempFile(File file) { | |||
| if (file.exists()) { | |||
| file.delete(); | |||
| } | |||
| } | |||
| private static String ocrLocalImgFile(String languagePath,String filePath,String fontName) throws Exception { | |||
| File imageFile = new File(filePath); | |||
| String result = testDoOCR_File(languagePath,imageFile,fontName); | |||
| deletetempFile(imageFile); | |||
| return result; | |||
| } | |||
| public static String ocrNetImgFile(String languagePath,String fileUrl,String fontName) throws Exception { | |||
| File imageFile = urlImgToFile(fileUrl); | |||
| String result = testDoOCR_File(languagePath,imageFile,fontName); | |||
| deletetempFile(imageFile); | |||
| return result; | |||
| } | |||
| /** | |||
| * Test of doOCR method, of class Tesseract. | |||
| * 根据图片文件进行识别 | |||
| * @throws Exception while processing image. | |||
| */ | |||
| public static String testDoOCR_File(String languagePath,File imageFile,String fontName) throws Exception { | |||
| logger.info("doOCR on a jpg image"); | |||
| //set language | |||
| instance.setDatapath(languagePath); | |||
| instance.setLanguage(fontName); | |||
| String result = instance.doOCR(imageFile); | |||
| return result; | |||
| } | |||
| public static void main(String[] args) { | |||
| try { | |||
| //System.out.println(ocrNetImgFile(testResourcesLanguagePath,"https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fimg.my0832.com%2Fattachments%2Fbbs%2F20140424%2F201442413083356803_740_1186.jpg&refer=http%3A%2F%2Fimg.my0832.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1613903848&t=985fc4c6c7b7ee82cb98f97ab5bf1459","test1")); | |||
| System.out.println(ocrLocalImgFile(testResourcesLanguagePath,"C:\\Users\\iformall\\Desktop\\01.jpg","test1")); | |||
| } catch (Exception e) { | |||
| // TODO Auto-generated catch block | |||
| e.printStackTrace(); | |||
| } | |||
| } | |||
| // | |||
| // /** | |||
| // * Test of doOCR method, of class Tesseract. | |||
| // * 根据图片流进行识别 | |||
| // * @throws Exception while processing image. | |||
| // */ | |||
| // public void testDoOCR_BufferedImage() throws Exception { | |||
| // logger.info("doOCR on a buffered image of a PNG"); | |||
| // File imageFile = new File(this.testResourcesDataPath, "ocr.png"); | |||
| // BufferedImage bi = ImageIO.read(imageFile); | |||
| // | |||
| // //set language | |||
| // instance.setDatapath(testResourcesLanguagePath); | |||
| // instance.setLanguage("chi_sim"); | |||
| // | |||
| // String result = instance.doOCR(bi); | |||
| // logger.info(result); | |||
| // } | |||
| // | |||
| // /** | |||
| // * Test of getSegmentedRegions method, of class Tesseract. | |||
| // * 得到每一个划分区域的具体坐标 | |||
| // * @throws java.lang.Exception | |||
| // */ | |||
| // public void testGetSegmentedRegions() throws Exception { | |||
| // logger.info("getSegmentedRegions at given TessPageIteratorLevel"); | |||
| // File imageFile = new File(testResourcesDataPath, "ocr.png"); | |||
| // BufferedImage bi = ImageIO.read(imageFile); | |||
| // int level = TessPageIteratorLevel.RIL_SYMBOL; | |||
| // logger.info("PageIteratorLevel: " + Utils.getConstantName(level, TessPageIteratorLevel.class)); | |||
| // List<Rectangle> result = instance.getSegmentedRegions(bi, level); | |||
| // for (int i = 0; i < result.size(); i++) { | |||
| // Rectangle rect = result.get(i); | |||
| // logger.info(String.format("Box[%d]: x=%d, y=%d, w=%d, h=%d", i, rect.x, rect.y, rect.width, rect.height)); | |||
| // } | |||
| // | |||
| // assertTrue(result.size() > 0); | |||
| // } | |||
| // | |||
| // | |||
| // /** | |||
| // * Test of doOCR method, of class Tesseract. | |||
| // * 根据定义坐标范围进行识别 | |||
| // * @throws Exception while processing image. | |||
| // */ | |||
| // public void testDoOCR_File_Rectangle() throws Exception { | |||
| // logger.info("doOCR on a BMP image with bounding rectangle"); | |||
| // File imageFile = new File(this.testResourcesDataPath, "ocr.png"); | |||
| // //设置语言库 | |||
| // instance.setDatapath(testResourcesLanguagePath); | |||
| // instance.setLanguage("chi_sim"); | |||
| // //划定区域 | |||
| // // x,y是以左上角为原点,width和height是以xy为基础 | |||
| // Rectangle rect = new Rectangle(84, 21, 15, 13); | |||
| // String result = instance.doOCR(imageFile, rect); | |||
| // logger.info(result); | |||
| // } | |||
| // | |||
| // /** | |||
| // * Test of createDocuments method, of class Tesseract. | |||
| // * 存储结果 | |||
| // * @throws java.lang.Exception | |||
| // */ | |||
| // public void testCreateDocuments() throws Exception { | |||
| // logger.info("createDocuments for png"); | |||
| // File imageFile = new File(this.testResourcesDataPath, "ocr.png"); | |||
| // String outputbase = "target/test-classes/docrenderer-2"; | |||
| // List<RenderedFormat> formats = new ArrayList<RenderedFormat>(Arrays.asList(RenderedFormat.HOCR, RenderedFormat.TEXT)); | |||
| // | |||
| // //设置语言库 | |||
| // instance.setDatapath(testResourcesLanguagePath); | |||
| // instance.setLanguage("chi_sim"); | |||
| // | |||
| // instance.createDocuments(new String[]{imageFile.getPath()}, new String[]{outputbase}, formats); | |||
| // } | |||
| // | |||
| // /** | |||
| // * Test of getWords method, of class Tesseract. | |||
| // * 取词方法 | |||
| // * @throws java.lang.Exception | |||
| // */ | |||
| // public void testGetWords() throws Exception { | |||
| // logger.info("getWords"); | |||
| // File imageFile = new File(this.testResourcesDataPath, "ocr.png"); | |||
| // | |||
| // //设置语言库 | |||
| // instance.setDatapath(testResourcesLanguagePath); | |||
| // instance.setLanguage("chi_sim"); | |||
| // | |||
| // //按照每个字取词 | |||
| // int pageIteratorLevel = TessPageIteratorLevel.RIL_SYMBOL; | |||
| // logger.info("PageIteratorLevel: " + Utils.getConstantName(pageIteratorLevel, TessPageIteratorLevel.class)); | |||
| // BufferedImage bi = ImageIO.read(imageFile); | |||
| // List<Word> result = instance.getWords(bi, pageIteratorLevel); | |||
| // | |||
| // //print the complete result | |||
| // for (Word word : result) { | |||
| // logger.info(word.toString()); | |||
| // } | |||
| // } | |||
| // | |||
| // /** | |||
| // * Test of Invalid memory access. | |||
| // * 处理倾斜 | |||
| // * @throws Exception while processing image. | |||
| // */ | |||
| // public void testDoOCR_SkewedImage() throws Exception { | |||
| // //设置语言库 | |||
| // instance.setDatapath(testResourcesLanguagePath); | |||
| // instance.setLanguage("chi_sim"); | |||
| // | |||
| // logger.info("doOCR on a skewed PNG image"); | |||
| // File imageFile = new File(this.testResourcesDataPath, "ocr_skewed.jpg"); | |||
| // BufferedImage bi = ImageIO.read(imageFile); | |||
| // ImageDeskew id = new ImageDeskew(bi); | |||
| // double imageSkewAngle = id.getSkewAngle(); // determine skew angle | |||
| // if ((imageSkewAngle > MINIMUM_DESKEW_THRESHOLD || imageSkewAngle < -(MINIMUM_DESKEW_THRESHOLD))) { | |||
| // bi = ImageHelper.rotateImage(bi, -imageSkewAngle); // deskew image | |||
| // } | |||
| // | |||
| // String result = instance.doOCR(bi); | |||
| // logger.info(result); | |||
| // } | |||
| } | |||
| @@ -1,135 +0,0 @@ | |||
| package com.iformall.ocr; | |||
| import java.io.BufferedWriter; | |||
| import java.io.File; | |||
| import java.io.FileWriter; | |||
| import java.io.IOException; | |||
| import java.io.InputStreamReader; | |||
| import java.io.LineNumberReader; | |||
| /** | |||
| * 训练 | |||
| * @author iformall | |||
| */ | |||
| public class FormallTess4jTrain { | |||
| private static final String newFileFolder = "C:\\Users\\iformall\\Desktop\\newfile"; | |||
| private static final String huanhangstr = " \n "; | |||
| private static String getprefix(String lang,String fontName) { | |||
| String realFileName = lang+"."+fontName+".exp0"; | |||
| return realFileName; | |||
| } | |||
| private static String createBoxFile(String tifFileName,String lang,String fontName) { | |||
| String prefix = getprefix(lang,fontName); | |||
| String realFileName = prefix+".tif"; | |||
| if (tifFileName.equals(realFileName)) { | |||
| String cmdstr = "tesseract "+tifFileName+" "+prefix+" -l chi_sim batch.nochop makebox"; | |||
| return cmdstr; | |||
| //String result = executeLocalCmd(cmdstr, null); | |||
| //System.out.println("Done createBoxFile"+result); | |||
| }else { | |||
| return "文件必须是.tif"; | |||
| } | |||
| } | |||
| private static String createTranFile(String lang,String fontName) { | |||
| String prefix = getprefix(lang,fontName); | |||
| String realFileName = prefix+".tif"; | |||
| String trainCmdstr = "tesseract "+realFileName+" "+prefix+" nobatch box.train"; | |||
| return trainCmdstr; | |||
| } | |||
| private static String getBoxFont(String lang,String fontName) { | |||
| String prefix = getprefix(lang,fontName); | |||
| String extractorCmdstr = "unicharset_extractor "+prefix+".box [other .box files...]"; | |||
| return extractorCmdstr; | |||
| } | |||
| /** | |||
| * 第六步,执行完成后生成以下几个文件加前缀 | |||
| * unicharset、inttemp、pffmtable、shapetable、normproto 添加这几个文件的前缀为fontName | |||
| * @param lang | |||
| * @param fontName | |||
| * @return | |||
| */ | |||
| private static String renameTrainFiles(String fontName) { | |||
| StringBuffer sb = new StringBuffer(); | |||
| String renCmdstr = "REN unicharset "+fontName+".unicharset"; | |||
| sb.append(renCmdstr).append(huanhangstr); | |||
| renCmdstr = "REN inttemp "+fontName+".inttemp"; | |||
| sb.append(renCmdstr).append(huanhangstr); | |||
| renCmdstr = "REN pffmtable "+fontName+".pffmtable"; | |||
| sb.append(renCmdstr).append(huanhangstr); | |||
| renCmdstr = "REN shapetable "+fontName+".shapetable"; | |||
| sb.append(renCmdstr).append(huanhangstr); | |||
| renCmdstr = "REN normproto "+fontName+".normproto"; | |||
| sb.append(renCmdstr).append(huanhangstr); | |||
| return sb.toString(); | |||
| } | |||
| /** | |||
| * 第七步:合并5个文件 | |||
| * @param lang | |||
| * @param fontName | |||
| * @return | |||
| */ | |||
| private static String mergeTrainFiles(String fontName) { | |||
| String mergeCmdstr = "combine_tessdata "+fontName+"."; | |||
| return mergeCmdstr; | |||
| } | |||
| public static String getTrainSteps(String lang,String fontName) { | |||
| StringBuffer sb = new StringBuffer("请先安装tess4j(4.0以上),配置好环境变量. 下载jTessBoxEditor(用于训练,带FX的支持中文)").append(huanhangstr); | |||
| sb.append("请进入到样本图片文件夹用doc命令执行.").append(huanhangstr); | |||
| sb.append("第一步,用jTessBoxEditor --> Tools --> Merge 多选图片,保存为tif格式 .命名格式为[lang].[fontName].exp0.tif. 命名:").append(lang).append(".").append(fontName).append(".exp0.tif ").append(huanhangstr); | |||
| sb.append("............ ").append(huanhangstr); | |||
| sb.append("第二步,用tif生成box ").append(huanhangstr); | |||
| sb.append(createBoxFile(lang+"."+fontName+".exp0.tif", lang, fontName)).append(huanhangstr); | |||
| sb.append("............ ").append(huanhangstr); | |||
| sb.append("第三步,用jTessBoxEditor 打开.box文件进行矫正 ").append(huanhangstr); | |||
| sb.append("............ ").append(huanhangstr); | |||
| sb.append("第四步:用box文件生成。tr文件 ").append(huanhangstr); | |||
| sb.append(createTranFile(lang,fontName)).append(huanhangstr); | |||
| sb.append("............ ").append(huanhangstr); | |||
| sb.append("@@@!!!!从此处开始,可以处理多个字库处理。如原来的字库现在做升级,需要把老的字库的。tif,.box,.tr文件重新命名也放到同目录文件夹, ").append(huanhangstr); | |||
| sb.append("............ ").append(huanhangstr); | |||
| sb.append("第五步:提取box字符 ").append(huanhangstr); | |||
| sb.append(getBoxFont(lang,fontName)).append(huanhangstr); | |||
| sb.append("............ ").append(huanhangstr); | |||
| sb.append("第六步:新建font_properties(没有.txt后缀), 把所有box对应的字体特征加进去。").append(huanhangstr); | |||
| sb.append("fontname为字体名称,保持和 图片集文件 .tif 和.box文件的前缀名一致 .<italic> 、<bold> 、<fixed> 、<serif>、 <fraktur>的取值为1或0,表示字体是否具有这些属性。 ").append(huanhangstr); | |||
| sb.append("如以下内容: ").append(huanhangstr); | |||
| sb.append("fontName1 0 0 0 0 0 ").append(huanhangstr); | |||
| sb.append("fontName2 0 1 0 0 0 ").append(huanhangstr); | |||
| sb.append("fontName3 1 1 0 0 0 ").append(huanhangstr); | |||
| sb.append("............ ").append(huanhangstr); | |||
| sb.append("第六步:批量执行系列命令。多个文件在后面累加。 ").append(huanhangstr); | |||
| String prefix = getprefix(lang,fontName); | |||
| String shapeCmdStr = "### shapeclustering -F font_properties -U unicharset "+prefix+".tr [other .tr files...] "; | |||
| sb.append(shapeCmdStr).append(huanhangstr); | |||
| String mftraingCmdstr = "mftraining -F font_properties -U unicharset -O unicharset "+prefix+".tr [other .tr files...] "; | |||
| sb.append(mftraingCmdstr).append(huanhangstr); | |||
| String cntrainCmdstr = "cntraining "+prefix+".tr [other .tr files...] "; | |||
| sb.append(cntrainCmdstr).append(huanhangstr); | |||
| sb.append("............ ").append(huanhangstr); | |||
| sb.append("第七步,执行完成后生成以下几个文件加前缀: unicharset、inttemp、pffmtable、shapetable、normproto 添加这几个文件的前缀为[fontName] ").append(huanhangstr); | |||
| sb.append(renameTrainFiles(fontName)); | |||
| sb.append("............ ").append(huanhangstr); | |||
| sb.append("第七步:合并5个文件").append(huanhangstr); | |||
| sb.append(mergeTrainFiles(fontName)).append(huanhangstr); | |||
| sb.append("............ ").append(huanhangstr); | |||
| sb.append("第八步:将").append(fontName).append(".traineddata 文件拷贝到后端服务器ocr_data(项目配置fm.ocr_data)目录下。 .tif、。box、。tr文件也需要保留,后面如果这个字库有更新,需要用到这些文件。").append(huanhangstr); | |||
| return sb.toString(); | |||
| } | |||
| } | |||
| @@ -0,0 +1,126 @@ | |||
| package com.iformall.video; | |||
| public class UploadVideoDemo { | |||
| //账号AK信息(必选) | |||
| private static final String accessKeyId = ""; | |||
| //账号AK信息(必选) | |||
| private static final String accessKeySecret = ""; | |||
| public static void main(String[] args) { | |||
| //1.音视频上传-本地文件上传 | |||
| //视频标题(必选) | |||
| String title = "测试标题"; | |||
| //本地文件上传和文件流上传时,文件名称为上传文件绝对路径,如:/User/sample/文件名称.mp4 (必选) | |||
| //文件名必须包含扩展名 | |||
| String fileName = "测试文件名称.mp4"; | |||
| //本地文件上传 | |||
| testUploadVideo(accessKeyId, accessKeySecret, title, fileName); | |||
| //2.图片上传-本地文件上传 | |||
| testUploadImageLocalFile(accessKeyId, accessKeySecret); | |||
| } | |||
| /** | |||
| * 本地文件上传接口 | |||
| * | |||
| * @param accessKeyId | |||
| * @param accessKeySecret | |||
| * @param title | |||
| * @param fileName | |||
| */ | |||
| private static void testUploadVideo(String accessKeyId, String accessKeySecret, String title, String fileName) { | |||
| // UploadVideoRequest request = new UploadVideoRequest(accessKeyId, accessKeySecret, title, fileName); | |||
| /*可指定分片上传时每个分片的大小,默认为1M字节*/ | |||
| // request.setPartSize(1 * 1024 * 1024L); | |||
| /*可指定分片上传时的并发线程数,默认为1(注:该配置会占用服务器CPU资源,需根据服务器情况指定)*/ | |||
| // request.setTaskNum(1); | |||
| /*是否开启断点续传,默认断点续传功能关闭。当网络不稳定或者程序崩溃时,再次发起相同上传请求,可以继续未完成的上传任务,适用于超时3000秒仍不能上传完成的大文件。 | |||
| 注意: 断点续传开启后,会在上传过程中将上传位置写入本地磁盘文件,影响文件上传速度,请您根据实际情况选择是否开启*/ | |||
| // request.setEnableCheckpoint(false); | |||
| /*OSS慢请求日志打印超时时间,是指每个分片上传时间超过该阈值时会打印debug日志,如果想屏蔽此日志,请调整该阈值。单位: 毫秒,默认为300000毫秒*/ | |||
| //request.setSlowRequestsThreshold(300000L); | |||
| /*可指定每个分片慢请求时打印日志的时间阈值,默认为300s*/ | |||
| //request.setSlowRequestsThreshold(300000L); | |||
| /*是否使用默认水印(可选),指定模板组ID时,根据模板组配置确定是否使用默认水印*/ | |||
| //request.setIsShowWaterMark(true); | |||
| /*自定义消息回调设置(可选),参数说明参考文档 https://help.aliyun.com/document_detail/86952.html#UserData*/ | |||
| // request.setUserData("{\"Extend\":{\"test\":\"www\",\"localId\":\"xxxx\"},\"MessageCallback\":{\"CallbackURL\":\"http://test.test.com\"}}"); | |||
| /*视频分类ID(可选)*/ | |||
| //request.setCateId(0); | |||
| /*视频标签,多个用逗号分隔(可选)*/ | |||
| //request.setTags("标签1,标签2"); | |||
| /*视频描述(可选)*/ | |||
| //request.setDescription("视频描述"); | |||
| /*封面图片(可选)*/ | |||
| //request.setCoverURL("http://cover.sample.com/sample.jpg"); | |||
| /*模板组ID(可选)*/ | |||
| //request.setTemplateGroupId("8c4792cbc8694*****d5330e56a33d"); | |||
| /*点播服务接入点*/ | |||
| //request.setApiRegionId("cn-shanghai"); | |||
| /*ECS部署区域,如果与点播存储(OSS)区域相同,则自动使用内网上传文件至存储*/ | |||
| // request.setEcsRegionId("cn-shanghai"); | |||
| /*存储区域(可选)*/ | |||
| //request.setStorageLocation("in-2017032*****18266-5sejdln9o.oss-cn-shanghai.aliyuncs.com"); | |||
| /*开启默认上传进度回调*/ | |||
| // request.setPrintProgress(true); | |||
| /*设置自定义上传进度回调(必须继承 ProgressListener)*/ | |||
| // request.setProgressListener(new PutObjectProgressListener()); | |||
| // UploadVideoImpl uploader = new UploadVideoImpl(); | |||
| // UploadVideoResponse response = uploader.uploadVideo(request); | |||
| // System.out.print("RequestId=" response.getRequestId() "\n"); //请求视频点播服务的请求ID | |||
| // if (response.isSuccess()) { | |||
| // System.out.print("VideoId=" response.getVideoId() "\n"); | |||
| // } else { | |||
| // /* 如果设置回调URL无效,不影响视频上传,可以返回VideoId同时会返回错误码。其他情况上传失败时,VideoId为空,此时需要根据返回错误码分析具体错误原因 */ | |||
| // System.out.print("VideoId=" response.getVideoId() "\n"); | |||
| // System.out.print("ErrorCode=" response.getCode() "\n"); | |||
| // System.out.print("ErrorMessage=" response.getMessage() "\n"); | |||
| // } | |||
| } | |||
| /** | |||
| * 图片上传接口,本地文件上传示例 | |||
| * 参数参考文档 https://help.aliyun.com/document_detail/55619.html | |||
| * | |||
| * @param accessKeyId | |||
| * @param accessKeySecret | |||
| */ | |||
| private static void testUploadImageLocalFile(String accessKeyId, String accessKeySecret) { | |||
| //图片类型(必选)取值范围:default(默认),cover(封面),watermark(水印) | |||
| String imageType = "cover"; | |||
| // UploadImageRequest request = new UploadImageRequest(accessKeyId, accessKeySecret, imageType); | |||
| // /*图片文件扩展名(可选)取值范围:png,jpg,jpeg*/ | |||
| // //request.setImageExt("png"); | |||
| // /*图片标题(可选)长度不超过128个字节,UTF8编码*/ | |||
| // //request.setTitle("图片标题"); | |||
| // /*图片标签(可选)单个标签不超过32字节,最多不超过16个标签,多个用逗号分隔,UTF8编码*/ | |||
| // //request.setTags("标签1,标签2"); | |||
| // /*存储区域(可选)*/ | |||
| // //request.setStorageLocation("out-4f3952f78c021*****013e7.oss-cn-shanghai.aliyuncs.com"); | |||
| // /*流式上传时,InputStream为必选,fileName为源文件名称,如:文件名称.png(可选)*/ | |||
| // //request.setFileName("测试文件名称.png"); | |||
| // /*开启默认上传进度回调*/ | |||
| // // request.setPrintProgress(true); | |||
| // /*设置自定义上传进度回调(必须继承 ProgressListener)*/ | |||
| // // request.setProgressListener(new PutObjectProgressListener()); | |||
| // /*点播服务接入点*/ | |||
| // //request.setApiRegionId("cn-shanghai"); | |||
| // /*ECS部署区域,如果与点播存储(OSS)区域相同,则自动使用内网上传文件至存储*/ | |||
| // // request.setEcsRegionId("cn-shanghai"); | |||
| // | |||
| // UploadImageImpl uploadImage = new UploadImageImpl(); | |||
| // UploadImageResponse response = uploadImage.upload(request); | |||
| // System.out.print("RequestId=" response.getRequestId() "\n"); | |||
| // if (response.isSuccess()) { | |||
| // System.out.print("ImageId=" response.getImageId() "\n"); | |||
| // System.out.print("ImageURL=" response.getImageURL() "\n"); | |||
| // } else { | |||
| // System.out.print("ErrorCode=" response.getCode() "\n"); | |||
| // System.out.print("ErrorMessage=" response.getMessage() "\n"); | |||
| // } | |||
| } | |||
| } | |||
| @@ -0,0 +1,6 @@ | |||
| package com.iformall.video; | |||
| public interface VideoExcutor { | |||
| } | |||
| @@ -0,0 +1,33 @@ | |||
| package com.iformall.video; | |||
| import java.util.Map; | |||
| import java.util.concurrent.ConcurrentHashMap; | |||
| import org.springframework.beans.factory.annotation.Autowired; | |||
| import org.springframework.stereotype.Service; | |||
| import com.iformall.video.aliyun.AliyunVideoExcutor; | |||
| @Service | |||
| public class VideoFactory { | |||
| private Map<String,VideoExcutor> excutorMap = null; | |||
| @Autowired | |||
| AliyunVideoExcutor aliyunExcutor; | |||
| private Map<String,VideoExcutor> getExcutorMap() { | |||
| if (null == excutorMap) { | |||
| excutorMap = new ConcurrentHashMap<String,VideoExcutor>(); | |||
| excutorMap.put("aliyun", aliyunExcutor); | |||
| } | |||
| return excutorMap; | |||
| } | |||
| public VideoExcutor getExcutor(String type) { | |||
| VideoExcutor service = getExcutorMap().get(type); | |||
| return service; | |||
| } | |||
| } | |||
| @@ -0,0 +1,10 @@ | |||
| package com.iformall.video.aliyun; | |||
| import org.springframework.stereotype.Component; | |||
| import com.iformall.video.VideoExcutor; | |||
| @Component | |||
| public class AliyunVideoExcutor implements VideoExcutor { | |||
| } | |||
| @@ -0,0 +1,51 @@ | |||
| package com.iformall.video.aliyun.config; | |||
| import org.springframework.boot.context.properties.ConfigurationProperties; | |||
| import org.springframework.context.annotation.Configuration; | |||
| import lombok.Data; | |||
| @Data | |||
| @Configuration | |||
| @ConfigurationProperties(prefix = "video.aliyun") | |||
| public class AliyunVideoConfig { | |||
| private String access; | |||
| private String secret; | |||
| private String clientRegion; | |||
| private String bucketName; | |||
| public String getAccess() { | |||
| return access; | |||
| } | |||
| public void setAccess(String access) { | |||
| this.access = access; | |||
| } | |||
| public String getSecret() { | |||
| return secret; | |||
| } | |||
| public void setSecret(String secret) { | |||
| this.secret = secret; | |||
| } | |||
| public String getClientRegion() { | |||
| return clientRegion; | |||
| } | |||
| public void setClientRegion(String clientRegion) { | |||
| this.clientRegion = clientRegion; | |||
| } | |||
| public String getBucketName() { | |||
| return bucketName; | |||
| } | |||
| public void setBucketName(String bucketName) { | |||
| this.bucketName = bucketName; | |||
| } | |||
| } | |||