抖音自己创作的视频怎样去水印,抖音上自己做的视频怎么去水印

  抖音自己创作的视频怎样去水印,抖音上自己做的视频怎么去水印

  

java基础栏目介绍去水印工具的方法。

  如何解决写爬虫IP受阻的问题?立即使用。

  相关学习推荐:java基础

  

百因必有果

  说说我为什么要做抖音视频水印工具?其实是因为我的沙雕女友,她跟我一样~

  在Tik Tok的一个晚上,她看到了一个很有教育意义的视频“爱媳妇的男人应该做所有的家务”,然后她想把视频下载下来,和姐妹团分享一下控制老公的经验。

  但是大家都知道Tik Tok下载的视频是带水印的,作为一个有严重强迫症的玩家是不允许的。如果实在没办法,就找个水印工具。找一圈,要么被收费,要么下载不了,脸上的笑容也就渐渐消失了。

  我在一旁调侃:不太难,要不我给你做一个!“你能做到吗?”然后投来不屑的一瞥。

  哦亲爱的!我只是在开玩笑。我做不到。我不能忍受。我要证明给你看!嗯,男人受不了这个。

  下面,我们来分析一下做这个水印工具的思路。很多人一听水印就下意识的觉得这是个很玄乎的算法,其实是错觉~

  

刨根问底

  虽然要争一口气,但是刚开始做的时候真的很尴尬,因为不知道从哪里入手,怎么水印。我一定要写一个算法吗?

  稍微分析一下,不难发现这是一个经过处理的短链接。那么这个短链接就会被重定向到真实的视频地址URL。

  以下网址是通过在https://v.douyin.com/JSkuhE4/浏览器中输入一个短链接获得的。以我的经验来看,URL中的6820792802394262795很可能是视频的唯一ID,唯一ID通常作为接口获取细节的参考。呵呵~我好像有头绪了。

  https://www.iesdouyin.com/share/video/6820792802394262795/

  急忙提供F12解决方案打开控制台,在众多请求中发现了这样一个接口,它居然用上了唯一ID。

  https://www.iesdouyin.com/web/api/v2/aweme/iteminfo/?item_ids=6820792802394262795

  更令人惊讶的是,接口返回的数据被称为细节,包括作者信息、音频地址、视频地址和平面图。但是没有水印就没有视频网址。

  只找到一个带水印的视频网址,有点失落。我又看了一下这个地址,发现wm和我的项目名有点像。不就是水印Watermark的缩写吗?

  https://aweme.snssdk.com/aweme/v1/playwm/?video _ id=v 0200 f 030000 bqk 54kg 2 saj 3 lso 3 oh 20 ratio=720 pline=0

  仿佛又看到了一丝希望,赶紧修改了网址,在浏览器里试了一遍。果然真的没有水印。

  https://aweme.snssdk.com/aweme/v1/play/?video _ id=v 0200 f 030000 bqk 54kg 2 saj 3 lso 3 oh 20 ratio=720 pline=0

  才发现Tik Tok的水印简单感人哈哈哈~

  

身体力行

  现在原理清楚了,剩下的就是一步步实现功能了。原理看起来挺简单的,但是实现起来还是有点坑,浪费了很多时间。

  实施过程中只有三个简单的步骤:

  1.过滤并从输入框中取出短视频链接。2.将短视频链接传到后端解析无水印视频URL。3.把视频网址传到前端预览下载后端并不难。按照上面的分析流程一步步分析真实的视频网址就可以了。

  /**

  * @param url

  * @作者符晓

  * @description获取当前链接的重定向url

  * @日期2020/9/15 12:43

  */公共静态字符串getLocation(字符串url) {

  尝试{

  URL serverUrl=新URL(网址);

  HttpURLConnection conn=(HttpURLConnection)server URL . open connection();

  conn . setrequestmethod( GET );

  conn . setinstancefolredirects(false);

  conn . setrequestproperty( User-agent , ua );//模拟手机连接

  conn . connect();

  string Location=conn . getheaderfield( Location );

  返回位置;

  } catch(异常e) {

  e。printstacktrace();

  }

  返回"";

  }下边是完整的后端实现,可以看到代码量非常的少。

  /**

  * @作者符晓-公众号:程序员内点事

  * @描述抖音无水印视频下载

  * @日期2020/9/15 18:44

  */@Slf4j

  @控制器公共类dy控制器{

  公共静态字符串DOU _ YIN _ BASE _ URL=https://www.iesdouyin.com/web/api/v2/aweme/iteminfo/?item _ ids=;

  /**

  * @param url

  * @作者符晓

  * @描述解析抖音无水印视频

  * @日期2020/9/15 12:43

  */

  @请求映射(/parseVideoUrl )

  @ResponseBody公共字符串parseVideoUrl(@RequestBody字符串网址)引发异常{

  dy dto dy dto=new dy dto();

  尝试{

  url=URLDecoder.decode(url).替换( url=, );

  /**

  * 1、短连接重定向后的统一资源定位器

  */

  字符串重定向URL=common utils。获取位置(URL);

  /**

  * 2、拿到视频对应的模块

  */

  字符串视频URL=

  字符串音乐URL=

  字符串视频pic=

  字符串desc=" ";

  如果(!字符串实用程序。isempty(redirectUrl)){

  /**

  * 3、用模块拿视频的详细信息,包括无水印视频全球资源定位器(统一资源定位器)

  */

  string itemId=公共实用工具。匹配号(重定向URL);

  StringBuilder sb=new StringBuilder();

  某人追加(DOU_YIN_BASE_URL).append(itemId);

  字符串视频结果=常用工具。http get(sb。tostring());

  dy结果dy结果=JSON。解析对象(视频结果,dy结果。类);

  /**

  * 4、无水印视频全球资源定位器(统一资源定位器)

  */

  videoUrl=dyResult.getItem_list().获取(0)。getVideo().getPlay_addr()。getUrl_list().获取(0)。replace(playwm , play );

  string videoRedirectUrl=common utils。获取位置(视频网址);

  dy dto。set video URL(videoRedirectUrl);

  /**

  * 5、音频全球资源定位器(统一资源定位器)

  */

  musicUrl=dyResult.getItem_list().获取(0)。getMusic().getPlay_url().getUri();

  dyDto.setMusicUrl(音乐网址);

  /**

  * 6、封面

  */

  videoPic=dyResult.getItem_list().获取(0)。getVideo().getDynamic_cover()。getUrl_list().get(0);

  戴德托。setvideopic(视频图像);

  /**

  * 7、视频文案

  */

  desc=dyResult.getItem_list().获取(0)。获取desc();

  戴德托。设定desc(desc);

  }

  } catch(异常e) {

  log.error(去水印异常{} ,e);

  }

  返回JSON。tojsonstring(dy dto);

  }}前端实现也比较简单,拿到后端解析出来的视频统一资源定位器预览播放、下载就好了。

  为快速实现我用了老古董JQuery,我这个年纪的人对它感情还是很深厚的,用户界面框架用的layer.js。源码后边会分享给大家,就不全贴出来了。

  $.ajax({

  URL:"/parseVideoUrl ",

  类型: POST ,

  数据:{url: link},

  成功:函数(数据){

  $(.qsy-提交)。attr(disabled ,false);

  尝试{

  var rows=JSON。解析(数据);

  图层.关闭(索引);

  layer.open({

  类型:1,

  题目:假的,

  closeBtn: 1,

  没错,

  皮肤:"你的阶级",

  内容:` p style=溢出:隐藏;高度:580像素宽度:350像素;PP class= pop button a href= # # # rel= no opener no follow no referrer onclick=下载视频($ { rows[ video URL ]} , $ { rows[ desc ]} ) button class= layui-BG-red layui-BTN-sm layui-BTN 下载视频/button/a/PP class= pop button textarea id= video URL cols= 1 rows= 1 style= height:0;宽度:0;位置:绝对;$ { rows[视频URL ]}/textarea button class= layui-BTN-sm layui-BG-blue layui-BTN onclick= copy(视频URL )复制链接/button/PP class= pop button a href= # # # rel= no opener no follow no referrer onclick=下载视频($ { rows[ musicUrl ]} , $ { rows[ desc ]} ) button class=拉伊-BTN-sm拉伊-BTN 下载音频/button/a/p video id= video width= 360 px height= 500 px src= $ { rows[ video URL ]} controls= true poster= $ { rows[ video pic ]} preload= auto WebKit-plays inline= true plays inline= true x-WebKit-airplay= allow X5-video-player-type= H5 X5-video-player-全屏= true X5

  //content:` video id= video src= $ { rows[ video URL ]} controls= true poster= $ { rows[ video pic ]} preload= auto WebKit-plays inline= true x-WebKit-airplay= allow X5-video-player-type= H5 X5-video-player-全屏= true X5-video-orientation= portraint style= object-fit:fill source SRS

  });

  } catch(错误){

  layer.alert(错误信息:错误,{

  标题: 异常,

  皮肤:拉依-层-兰,

  closeBtn: 0,

  anim: 4 //动画类型

  });

  返回错误的

  }

  },

  错误:函数(呃){

  控制台。日志(错误);

  图层.关闭(索引);

  $(.qsy-提交)。attr(disabled ,false);

  },

  完成:函数(){

  图层.关闭(索引);

  }})}) !-解决访问视频全球资源定位器(统一资源定位器)请求403异常-

  meta name= referrer content= no-referrer /还简单做了下移动端适配,样式看着还可以,但是功能使用起来有点差强人意,后边在做优化了。

  

总结

   很多东西就是这样,没认真研究之前总感觉深不可测,可一旦接触到技术的本质,又开始笑自己之前好蠢,懂与不懂有时就查那么一层窗户纸。以上就是爪哇岛程序员手写一个抖音视频去水印工具的详细内容,更多请关注我们其它相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: