抖音是目前国内非常流行的短视频平台之一,用户数量庞大,更是吸引了许多企业和个人在上面开设账号,通过发布内容来进行流量变现。但是,在一个账号发布内容的同时,管理员又需要同时关注多个账号,对账号的管理和运营成为一项非常繁琐的任务。为了解决这一问题,抖音账号矩阵系统应运而生。该系统实现了账号批量操作、批量发布、数据分析等功能,大大提升了账号运营的效率。
本文将通过解析抖音账号矩阵系统的源码,介绍该系统如何实现上述功能。
后端技术栈
抖音账号矩阵系统主要采用了Python + Django + MySQL的技术架构。其中,Django作为一种高度集成的Web框架,在开发过程中提供了许多功能模块,减少了代码量,同时也提供了很好的数据处理和模板引擎的支持。MySQL则作为数据库,存储了账号的信息、发布的内容、运营数据等信息。
八大智能渲染
别人有的我们有,别人没有的我们也有
开幕、贴纸、转场、特效、字幕、滤镜、语音、音乐
视频抽取+智能渲染=新视频
开幕
内置数十种开幕特效,对视频开幕画面进行特效渲染,让每个开头充满个性。
转场
内置近百个转场特效,两个视频连接处自动插入转场特效,让视频的每一帧都与众不同。
特效
内置烟花,爱心,下雨,光晕等几十种全景特效,在视频中自动渲染加载,让每个视频都如原创。
贴纸
内置数百个贴纸,随机自动加载到视频上,让你的视频充满趣味。
滤镜
内置黑白,复古,清新等数十种滤镜效果,让视频画面更有质感。
字幕
可自定义广告文案,自动同步到视频上,让视频更具广告价值。
语音
内置男生,女士,童声,方言等语音引擎,同步字幕,实现自动语音播报。
音乐
内置数千个背景音乐,随机自动替换原有音乐,让每个视频更有节奏感。
更能自定义在上面去做模板设计,设计符合自己需求的模板。
当然针对时下热门的数字人功能也是可以的,直接上传录制的一个人物视频,即可生成不同的背景模板以及不同的文案话术视频。
时间轴抽片合成
时间轴技术
所谓时间轴抽取就是不需要对原始素材切片,直接从原始素材中拿指定的时间轴上的某一段然后直接合成新的视频。
时间轴优势
无需对原始视频进行切片存储,成本更低,效率更高,对视频损耗更小,真正做到灵活按时间随意抽片,快速合成。通过时间轴抽片合成技术,将开头,结尾,中间共计6个原始视频素材,通过复杂计算公式,随机抽取1-3秒,随机生成一个全新视频,可轻松解决短视频限流,配合八大渲染技术,让每个输出视频犹如原创。
代码展示:
['title' => 'AI视频创意', 'link' => '#'],
['title' => '创意工程', 'link' => '#'],
];
$this->buildBreadcrumbs($breadcrumbs);
$mode = $this->request->getIntParam('mode', 0);
$this->output['mode'] = $mode;
$time_range = $this->request->getStrParam('time_range');
$keyword_type = $this->request->getStrParam('keyword_type');
$keyword = $this->request->getStrParam('keyword');
$where = [
['name' => 'dv_s_id', 'oper' => '=', 'value' => $this->sid]
];
if(!empty($time_range)){
$add_time_range_arr = explode('~',$time_range);
$where[] = ['name' => 'dv_create_time', 'oper' => '>=', 'value' => strtotime($add_time_range_arr[0])];
$where[] = ['name' => 'dv_create_time', 'oper' => '<', 'value' => strtotime($add_time_range_arr[1]) + 86400];
}
if(!empty($keyword_type)){
$where[] = ['name' => $keyword_type, 'oper' => 'like', 'value' => "%{$keyword}%"];
}
if ($mode > 0) {
$where[] = ['name' => 'dv_video_mode', 'oper' => '=', 'value' => $mode];
}
$sort = ['dv_create_time' => 'DESC'];
//获取视频列表
$Video_model = new App_Model_Douyin_MysqlVideoStorage();
$video_list = $Video_model->getList($where,$this->index,$this->count,$sort);
$temp_video_model = new App_Model_Douyin_MysqlVideoTempVideoStorage($this->sid);
$pailie_video_model = new App_Model_Douyin_MysqlVideoMaterialPailieStorage();
foreach ($video_list as &$item) {
$item['cache_num'] = $temp_video_model->getTempVideoCountByItem($item['dv_id']);
$item['pailie'] = $pailie_video_model->getRowByDvid($item['dv_id']);
$progerss = 40;
if ($item['video_num'] > 0 || $item['image_num'] > 0) {
$progerss += 10;
}
if ($item['audio_num'] > 0 || $item['write_num'] > 0) {
$progerss += 10;
}
if ($item['pailie']['dvmp_is_zuhe']) {
$progerss += 20;
}
if ($item['cache_num'] > 0) {
$progerss += 20;
}
$item['progress'] = $progerss;
}
//计算分页
$active_list_all = $Video_model->getCount($where);
$page_libs = new Libs_Pagination_Paginator($active_list_all,$this->count,'jquery',true);
$pageHtml = $page_libs->render();
$this->output['time_range'] = $time_range;
$this->output['keyword_type'] = $keyword_type;
$this->output['keyword'] = $keyword;
$this->output['video_list'] = $video_list;
$this->output['pageHtml'] = $pageHtml;
$this->output['progress_line'] = [
20 => ['color' => 'red', 'tip' => '创建创意工程已完成'],
40 => ['color' => 'red', 'tip' => '选择混剪模式已完成'],
50 => ['color' => 'orange', 'tip' => '添加音视频素材未完成'],
60 => ['color' => 'orange', 'tip' => '添加音视频素材已完成'],
70 => ['color' => 'blue', 'tip' => '视频混剪组合已完成'],
80 => ['color' => 'blue', 'tip' => '视频混剪组合已完成'],
90 => ['color' => 'green', 'tip' => '视频缓存已完成'],
100 => ['color' => 'green', 'tip' => '工程所有步骤已完成'],
];
$this->output_mode_link();
$this->displaySmarty('dydqtshoppc/video/item-list.tpl');
}
/*
* 剪辑模式链接
*/
private function output_mode_link() {
$video_mixed_mode = plum_parse_config('project_mixed_mode', 'dydqt/project');
array_unshift($video_mixed_mode, [
'title' => '全部',
'mode' => 0,
'desc' => '',
]);
foreach ($video_mixed_mode as &$item) {
$item['link'] = "/dydqtshoppc/video/itemList?mode=".$item['mode'];
}
$this->output['video_mixed_mode'] = $video_mixed_mode;
}
/**
* 视频列表
*/
public function videoListAction() {
//面包屑
$breadcrumbs = [
['title' => '账号运营', 'link' => '#zhyy'],
['title' => '短视频管理', 'link' => '/video/videoList'],
];
$this->buildBreadcrumbs($breadcrumbs);