抖音自己创作的视频怎样去水印,抖音上自己做的视频怎么去水印
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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。