• 如何在Ubuntu 20.04服务器上安装AVideo/YouPHPTube

    本教程将向您展示如何在Ubuntu20.04上使用AVideo(以前的YouPHPTube)运行自己的视频共享网站。AVideo是YouTube、Vimeo等视频共享网站的开源自托管替代品。有了AVideo,用户可以将视频上传到服务器并与互联网共享。 AVideo功能 无限和同步的直播流,你可以有无限的用户连接到每个直播流。 直接从互联网导入和编码其他网站的视频 从本地视频目录批量编码 制作私人视频 与Youtube完全集成,将视频与Youtube同步 将多种格式的多媒体文件转换为MP4、WebM和MP3文件 支持Amazon S3(简单存储服务) 响应性网站布局。AVideo在任何设备上都令人难以置信。(您可以选择YouTube或Netfilx样式的布局。) 用户频道和用户播放列表 订阅你喜欢的频道 您可以使用AVideo Statistics中的最新指标和报告监控视频的性能。 使用插件扩展站点功能。 搜索引擎优化 iOS和安卓应用可用 AVideo服务器要求 首先,你应该知道,对于视频共享网站来说,单核CPU是不可行的,因为编码过程会占用大量CPU资源。 然后根据站点的用户数量选择服务器规格。 如果你只想用它来分享你自己的视频,你需要一个至少有2个CPU核和4GB内存的服务器。您可以从Contabo购买功能强大的VPS(虚拟专用服务器),成本很低。 如果你希望你的站点有几十个用户,那么你可以考虑Cababo特大VPS,它有10个CPU内核,60GB RAM,1Gb/s端口速度,1.6TB磁盘空间,无限流量,但成本只有26.99欧元/月。 当你的站点增长超过这个范围时,你应该购买一台专用服务器。 在Ubuntu 20.04上安装AVideo的软件要求 AVideo需要PHP和MySQL/MariaDB。要学习本教程,您应该已经设置了灯堆栈或LEMP堆栈。如果您更喜欢使用ApacheWeb服务器,请安装LAMP堆栈。 如何在Ubuntu 20.04上安装LAMP(Apache、MariaDB、PHP)堆栈 如果您更喜欢使用Nginx web服务器,请安装LEMP stack。 如何在Ubuntu 20.04上安装LEMP(Nginx、MariaDB、PHP)堆栈 注:AVideo对Nginx的支持只是实验性的。如果使用Nginx,您的网站可能会出现问题。 你还需要一个域名。我在namescape注册了我的域名,因为价格低廉,而且他们终身免费保护whois的隐私。 AVideo由两部分组成。 主要部分是前端流服务器,它允许用户观看现有的视频。 另一部分是编码器,它允许用户上传他们的视频。 公共编码器使用域名https://encoder1.avideo.com.如果你不想让用户在上传视频时离开你的网站,你需要设置你的私人编码器。在本文中,我将向您展示如何进行。不用麻烦了,我们开始吧。 第一步:在Ubuntu 20.04服务器上下载AVideo 通过SSH登录Ubuntu 20.04服务器。然后转到web根目录。 cd /var/www/ 从Github克隆AVideo streamer存储库。 sudo apt install git sudo git clone https://github.com/WWBN/AVideo.git 然后进入目录。 cd AVideo/ 从Github克隆AVideo编码器存储库。 sudo git clone https://github.com/WWBN/AVideo-Encoder.git 它将被保存为AVideo编码器。我们将其重命名为upload,以便用户在上传视频时更好地了解此URL的用途。 sudo mv AVideo-Encoder upload 接下来,我们需要将www数据(web服务器用户)作为web根的所有者。 sudo chown www-data:www-data /var/www/AVideo/ -R 第2步:安装依赖项 AVideo使用FFmpeg对视频进行编码。我们可以从默认的Ubuntu存储库轻松安装FFmpeg。 sudo apt install ffmpeg 要在多媒体文件中读写元信息,我们需要安装libimage exiftool perl包。 sudo apt install libimage-exiftool-perl 您还需要安装一些常见的PHP扩展。 sudo apt install php7.4-cli php7.4-common php7.4-json php7.4-opcache php7.4-readline php7.4-curl php7.4-gd php7.4-xml 要从其他网站获取视频,我们需要安装YouTube DL。虽然它包含在Ubuntu存储库中,但已经过时了。我们将从Python包索引安装YouTube DL,该索引始终包含最新版本的YouTube DL。 sudo apt install python3-pip sudo -H pip3 install youtube-dl 使用最新版本非常重要,否则可能无法从其他网站下载视频。我们可以创建一个Cron作业来自动检查并安装最新版本。 sudo crontab -e 在Crontab文件的末尾添加以下行,尝试每天升级YouTube DL。 @daily sudo -H pip3 install --upgrade youtube-dl > /dev/null 第3步:在MariaDB中创建数据库和用户 使用以下命令登录MariaDB数据库服务器。由于MariaDB现在使用unix_socket插件来验证用户登录,因此无需输入MariaDB根密码。我们只需要在mysql命令前面加上sudo。 sudo mysql 然后为AVideo创建一个数据库。本教程将数据库命名为AVideo。你可以用任何你喜欢的名字。 create database AVideo; 创建数据库用户。同样,您可以使用此用户的首选名称。用首选密码替换密码。 create user AVideo@localhost identified by 'your-password'; 授予此用户在AVideo数据库上的所有权限。 grant all privileges on AVideo.* to AVideo@localhost; 我们还需要为编码器创建一个单独的数据库。 create database AVideoEncoder; 为此数据库创建一个用户。 create user AVideoEncoder@localhost identified by 'your-password'; 授予特权。 grant all privileges on AVideoEncoder.* to AVideoEncoder@localhost; 刷新特权表并退出。 flush privileges; exit; 第4步:设置Web服务器 我们可以使用Apache或Nginx web服务器。 阿帕奇 如果您喜欢Apache,可以使用命令行文本编辑器(如Nano)为AVideo创建一个虚拟主机文件。 sudo nano /etc/apache2/sites-available/avideo.conf 将以下文本放入文件中。用实际数据替换红色文本。我在本教程中使用了一个子域。如果你愿意,你可以使用你的主域名。不要忘记在DNS记录管理器中为域名创建DNS记录。另外,请注意文档根目录区分大小写,不应在末尾添加正斜杠。 <VirtualHost *:80> ServerName tube.yourdomain.com DocumentRoot /var/www/AVideo <Directory /var/www/AVideo> DirectoryIndex index.php Options +FollowSymLinks AllowOverride All Require all granted </Directory> ErrorLog ${APACHE_LOG_DIR}/avideo.error.log CustomLog ${APACHE_LOG_DIR}/avideo.access.log combined </VirtualHost> 保存并关闭文件。然后启用这个虚拟主机。 sudo a2ensite avideo.conf 我们需要启用重写模块。 sudo a2enmod rewrite 重新启动Apache以使更改生效。 sudo systemctl restart apache2 现在参观地铁。你的地盘。com,您将被重定向到安装向导页面(tube.yourdomain.com/install/index.php)。如果看到的是默认的Apache页面而不是安装向导,则需要禁用默认的虚拟主机。 sudo a2dissite 000-default.conf 然后重启Apache。 在安装向导中输入任何信息之前,我们需要启用HTTPS。 Nginx 如果你更喜欢Nginx,那就创建一个avideo。conf文件位于/etc/nginx/conf.d/目录中。 sudo nano /etc/nginx/conf.d/avideo.conf 将以下文本放入文件中。用实际数据替换红色文本。我在本教程中使用了一个子域。如果你愿意,你可以使用你的主域名。不要忘记在DNS记录管理器中为域名创建DNS记录。还要注意,文档根目录区分大小写。 server { listen 80; server_name tube.yourdomain.com; root /var/www/AVideo; index index.php index.html index.htm; charset utf-8; client_max_body_size 2G; access_log /var/log/nginx/avideo.access.log; error_log /var/log/nginx/avideo.error.log; location ~ /.php$ { fastcgi_split_path_info ^(.+/.php)(/.+)$; fastcgi_pass unix:/run/php/php7.4-fpm.sock; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; } # translating Apache rewrite rules in the .htaccess file to Nginx rewrite rules location / { rewrite ^/$ /view/ last; } location /bootstrap { rewrite ^/bootstrap/(.+)$ /view/bootstrap/$1 last; } location /js { rewrite ^/js/(.+)$ /view/js/$1 last; } location /css { rewrite ^/css/(.+)$ /view/css/$1 last; } location /img { rewrite ^/img/(.+)$ /view/img/$1 last; } location /page { rewrite ^/page/([0-9]+)/?$ /view/?page=$1 last; } location /videoOnly { rewrite ^/videoOnly/?$ /view/?type=video last; } location /audioOnly { rewrite ^/audioOnly/?$ /view/?type=audio last; } location = /download { rewrite ^(.*)$ /view/downloadExternalVideo.php last; } location = /downloadNow { rewrite ^(.*)$ /objects/downloadVideo.php last; } location = /getDownloadProgress { rewrite ^(.*)$ /objects/downloadVideoProgress.php last; } location = /about { rewrite ^(.*)$ /view/about.php last; } location = /contact { rewrite ^(.*)$ /view/contact.php last; } location = /sendEmail { rewrite ^(.*)$ /objects/sendEmail.json.php last; } location = /captcha { rewrite ^(.*)$ /objects/getCaptcha.php last; } location /monitor { rewrite ^/monitor/(.+)$ /objects/ServerMonitor/$1 last; } location /cat { rewrite ^/cat/([A-Za-z0-9-]+)/?$ /view/?catName=$1 last; } location /video { rewrite ^/video/([A-Za-z0-9-_.]+)/?$ /view/?videoName=$1 last; } location /videoEmbeded { rewrite ^/videoEmbeded/([A-Za-z0-9-_.]+)/?$ /view/videoEmbeded.php?videoName=$1 last; } location = /upload { rewrite ^(.*)$ /view/mini-upload-form/ last; } location = /fileUpload { rewrite ^(.*)$ /view/mini-upload-form/upload.php last; } location /uploadStatu { rewrite ^/uploadStatus /view/mini-upload-form/videoConversionStatus.php last; } location = /user { rewrite ^(.*)$ /view/user.php last; } location = /users { rewrite ^(.*)$ /view/managerUsers.php last; } location = /users.json { rewrite ^(.*)$ /objects/users.json.php last; } location = /updateUser { rewrite ^(.*)$ /objects/userUpdate.json.php last; } location = /savePhoto { rewrite ^(.*)$ /objects/userSavePhoto.php last; } location = /addNewUser { rewrite ^(.*)$ /objects/userAddNew.json.php last; } location = /deleteUser { rewrite ^(.*)$ /objects/userDelete.json.php last; } location = /recoverPass { rewrite ^(.*)$ /objects/userRecoverPass.php last; } location = /saveRecoverPassword { rewrite ^(.*)$ /objects/userRecoverPassSave.json.php last; } location = /signUp { rewrite ^(.*)$ /view/signUp.php last; } location = /createUser { rewrite ^(.*)$ /objects/userCreate.json.php last; } location = /usersGroups { rewrite ^(.*)$ /view/managerUsersGroups.php last; } location = /usersGroups.json { rewrite ^(.*)$ /objects/usersGroups.json.php last; } location = /addNewUserGroups { rewrite ^(.*)$ /objects/userGroupsAddNew.json.php last; } location = /deleteUserGroups { rewrite ^(.*)$ /objects/userGroupsDelete.json.php last; } location = /ads { rewrite ^(.*)$ /view/managerAds.php last; } location = /addNewAd { rewrite ^(.*)$ /objects/video_adsAddNew.json.php last; } location = /ads.json { rewrite ^(.*)$ /objects/video_ads.json.php last; } location = /deleteVideoAd { rewrite ^(.*)$ /objects/video_adDelete.json.php last; } location /adClickLo { rewrite ^/adClickLog /objects/video_adClickLog.php last; } location = /categories { rewrite ^(.*)$ /view/managerCategories.php last; } location = /categories.json { rewrite ^(.*)$ /objects/categories.json.php last; } location = /addNewCategory { rewrite ^(.*)$ /objects/categoryAddNew.json.php last; } location = /deleteCategory { rewrite ^(.*)$ /objects/categoryDelete.json.php last; } location = /orphanFiles { rewrite ^(.*)$ /view/orphanFiles.php last; } location = /mvideos { rewrite ^(.*)$ /view/managerVideos.php last; } location = /videos.json { rewrite ^(.*)$ /objects/videos.json.php last; } location = /deleteVideo { rewrite ^(.*)$ /objects/videoDelete.json.php last; } location = /addNewVideo { rewrite ^(.*)$ /objects/videoAddNew.json.php last; } location = /refreshVideo { rewrite ^(.*)$ /objects/videoRefresh.json.php last; } location = /setStatusVideo { rewrite ^(.*)$ /objects/videoStatus.json.php last; } location = /reencodeVideo { rewrite ^(.*)$ /objects/videoReencode.json.php last; } location = /addViewCountVideo { rewrite ^(.*)$ /objects/videoAddViewCount.json.php last; } location = /saveComment { rewrite ^(.*)$ /objects/commentAddNew.json.php last; } location /comments { rewrite ^/comments.json/([0-9]+)$ /objects/comments.json.php?video_id=$1 last; } location = /login { rewrite ^(.*)$ /objects/login.json.php last; } location = /logoff { rewrite ^(.*)$ /objects/logoff.php last; } location = /like { rewrite ^(.*)$ /objects/like.json.php?like=1 last; } location = /dislike { rewrite ^(.*)$ /objects/like.json.php?like=-1 last; } location /update { rewrite ^/update/?$ /update/update.php last; } location = /siteConfigurations { rewrite ^(.*)$ /view/configurations.php last; } location = /updateConfig { rewrite ^(.*)$ /objects/configurationUpdate.json.php last; } location = /charts { rewrite ^(.*)$ /view/charts.php last; } location = /upload/index.php { rewrite ^(.*)$ /upload/view/index.php last; } location = /upload/isAdmin { rewrite ^(.*)$ /upload/view/isAdmin.php last; } location = /upload/removeStreamer { rewrite ^(.*)$ /upload/view/removeStreamer.php last; } location = /upload/priority { rewrite ^(.*)$ /upload/view/priority.php last; } location = /upload/status { rewrite ^(.*)$ /upload/view/status.php last; } location = /upload/serverStatus { rewrite ^(.*)$ /upload/view/status.php?serverStatus=1 last; } location = /upload/upload { rewrite ^(.*)$ /upload/view/upload.php last; } location = /upload/listFiles.json { rewrite ^(.*)$ /upload/view/listFiles.json.php last; } location = /upload/deleteQueue { rewrite ^(.*)$ /upload/view/deleteQueue.php last; } location = /upload/saveConfig { rewrite ^(.*)$ /upload/view/saveConfig.php last; } location = /upload/youtubeDl.json { rewrite ^(.*)$ /upload/view/youtubeDl.json.php last; } location = /upload/send.json { rewrite ^(.*)$ /upload/view/send.json.php last; } location = /upload/streamers.json { rewrite ^(.*)$ /upload/view/streamers.json.php last; } location = /upload/queue.json { rewrite ^(.*)$ /upload/view/queue.json.php last; } location = /upload/queue { rewrite ^(.*)$ /upload/view/queue.php last; } location = /upload/login { rewrite ^(.*)$ /upload/objects/login.json.php last; } location = /upload/logoff { rewrite ^(.*)$ /upload/objects/logoff.json.php last; } location /upload/ { rewrite "^/getImage/([A-Za-z0-9=/]+)/([A-Za-z0-9]{3})$" /upload/objects/getImage.php?base64Url=$1&format=$2 last; rewrite "^/getImageMP4/([A-Za-z0-9=/]+)/([A-Za-z0-9]{3})/([0-9.]+)$" /upload/objects/getImageMP4.php?base64Url=$1&format=$2&time=$3 last; } location /upload/getSpiritsFromVideo { rewrite ^/getSpiritsFromVideo/([A-Za-z0-9=/]+)/([0-9]+)/([0-9]+)$ /upload/objects/getSpiritsFromVideo.php?base64Url=$1&tileWidth=$2&totalClips=$3 last; } location /upload/getLinkInfo { rewrite ^/getLinkInfo/([A-Za-z0-9=/]+)$ /upload/objects/getLinkInfo.json.php?base64Url=$1 last; } } 保存并关闭文件。然后测试Nginx配置。 sudo nginx -t 如果测试成功,请重新加载Nginx以使更改生效。 sudo systemctl reload nginx 现在参观地铁。你的地盘。com,您将被重定向到安装向导页面(tube.yourdomain.com/install/index.php)。在安装向导中输入任何信息之前,我们需要启用HTTPS。 第5步:启用HTTPS 为了加密HTTP流量,我们可以通过安装Let's encrypt颁发的免费TLS证书来启用HTTPS。运行以下命令在Ubuntu20.04服务器上安装Let's Encrypt client(certbot)。 sudo apt install certbot 如果使用Apache,还需要安装Certbot Apache插件。 sudo apt install python3-certbot-apache 并运行此命令以获取并安装TLS证书。 sudo certbot --apache --agree-tos --redirect --hsts --staple-ocsp --email [email protected] -d tube.yourdomain.com 如果使用Nginx,请安装Certbot Nginx插件。 sudo apt install python3-certbot-nginx 接下来,运行以下命令获取并安装TLS证书。 sudo certbot --nginx --agree-tos --redirect --hsts --staple-ocsp --email [email protected] -d tube.yourdomain.com 哪里 --nginx:使用nginx插件。 --apache:使用apache插件。 --同意:同意服务条款。 --重定向:通过301重定向强制HTTPS。 --hsts:为每个HTTP响应添加严格的传输安全头。强制浏览器始终对域使用TLS。防止SSL/TLS剥离。 --装订ocsp:启用ocsp装订。有效的OCSP响应被绑定到服务器在TLS期间提供的证书上。 现在应获得证书并自动安装。 第6步:使用安装向导完成安装 现在去看电视。你的地盘。com和安装向导将出现。在左侧,您可以看到服务器是否满足要求。 如果使用Nginx,可以忽略以下消息。 Your server is nginx/1.14.2, you must install Apache. 如您所见,PHP post_max_大小应至少为100M,upload_max_文件大小应至少为100M。我们需要编辑php。ini文件来更改这两个值。如果使用ApacheWeb服务器,那么 sudo nano /etc/php/7.4/apache2/php.ini 如果将Nginx与PHP-FPM一起使用,则需要编辑PHP的FPM版本。ini文件。 sudo nano /etc/php/7.4/fpm/php.ini 找到下面两行。 post_max_size = 8M upload_max_filesize = 2M 根据要上传的视频文件大小更改值。例如,如果允许上传1G视频文件,则 post_max_size = 1024M upload_max_filesize = 1024M 保存并关闭文件。重新启动Apache以使更改生效。 sudo systemctl restart apache2 如果将Nginx与PHP-FPM一起使用,则重新启动PHP-FPM。 sudo systemctl restart php7.4-fpm 现在刷新AVideo安装向导页面。你的服务器应该通过所有要求。现在,在右侧,您可以输入视频网站的标题,并设置系统管理员密码。输入之前创建的AVideo数据库名称、用户和密码。(注意:应该使用主数据库,而不是编码器数据库。还要注意区分大小写。) &nbsp; 单击“立即安装”按钮,AVideo应该已成功安装。 现在我们需要删除/var/www/AVideo/install/目录。 sudo rm /var/www/AVideo/install/ -r 单击转到主页按钮,您将看到AVideo主页。 您可以单击左侧的下拉菜单,以管理员用户身份登录,并使用刚才设置的密码。 第7步:设置编码器 去https://tube.yourdomain.com/upload/.您将被重定向到编码器设置向导。如果没有自动重定向,则可以手动输入安装向导URL。 https://tube.yourdomain.com/upload/install/index.php/ 左侧将显示您的服务器是否满足AVideo编码器的要求。 如果使用Nginx,可以忽略以下消息。 Your server is nginx/1.14.2, you must install Apache. 如您所见,PHP最大执行时间应至少为7200,PHP内存限制应至少为512M。我们需要编辑php。ini文件来更改这两个值。如果使用ApacheWeb服务器,那么 sudo nano /etc/php/7.4/apache2/php.ini 如果将Nginx与PHP-FPM一起使用,则需要编辑PHP的FPM版本。ini文件。 sudo nano /etc/php/7.4/fpm/php.ini 找到下面两行。 max_execution_time = 30 memory_limit = 128M 更改值。 max_execution_time = 7200 memory_limit = 512M 请注意,如果稍后的视频编码中途停止,则需要增加最大执行时间,或升级CPU。 保存并关闭文件。重新启动Apache以使更改生效。 sudo systemctl restart apache2 如果将Nginx与PHP-FPM一起使用,则重新启动PHP-FPM。 sudo systemctl restart php7.4-fpm 现在刷新AVideo编码器安装向导页面。你的服务器应该通过所有要求。现在,在右侧,您需要输入之前创建的AVideoEncoder数据库名称、用户和密码。注意区分大小写,并输入拖缆站点的管理员密码。 &nbsp; 单击“立即安装”按钮,将安装AVideo编码器。 删除安装目录。 sudo rm /var/www/AVideo/upload/install/ -r 然后转到主页。 第8步:更改编码器URL 默认情况下,AVideo使用公共编码器上传视频。要使用自己的编码器,请以管理员身份登录AVideo(不是AVideo encoder),然后从左侧栏进入管理面板。 转到设置-&gt;网站设置-&gt;高级配置。将编码器URL更改为https://tube.yourdomain.com/upload/.保存设置,清除缓存目录并生成新的站点地图。 现在退出并重新登录。如果你点击右上角的“视频和音频编码”按钮,你将被带到自己的编码器上传视频。需要注意的是,编码速度取决于服务器的CPU能力。它不需要太多RAM,因为编码器会将视频复制到上传目录(/var/www/AVideo/upload/videos)中的临时文件中。 第9步:配置SMTP 要发送电子邮件(如帐户注册、密码重置等),需要配置SMTP服务器。如果您想使用自己的邮件服务器向客户发送电子邮件,请查看以下文章以设置自己的邮件服务器。请注意,我强烈建议在全新干净的操作系统上运行iRedMail邮件服务器。在具有其他web应用程序的操作系统上安装iRedMail可能会失败,并可能破坏现有的应用程序。 如何使用iRedMail在Ubuntu20.04上轻松设置电子邮件服务器 如果你想使用SMTP中继服务,我建议使用Mailjet。您可以按照下面的教程在AVideo服务器上设置SMTP中继。 如何使用Mailjet在Ubuntu上设置后缀SMTP中继 您可以通过进入管理面板测试电子邮件发送-&gt;设置-&gt;网站设置-&gt;高级配置,您可以找到SMTP配置。使用以下设置。 启用SMTP。 启用SMTP验证。 在SMTP安全中使用tls。 使用587作为SMTP端口。 输入邮件服务器的主机名。 输入SMTP用户名和密码。 单击“保存”按钮保存设置,然后单击“测试电子邮件”查看其是否工作。 &nbsp; 启用TCP BBR 对于视频流服务器,建议按照本文中的说明在Linux内核中启用TCP BBR拥塞控制算法。 如何通过启用TCP BBR轻松提升Ubuntu网络性能 移动应用 你可以在谷歌Play Store上搜索AVideo,或在Apple Store上搜索YPT Mobile,下载免费的android应用程序或iOS应用程序。白标移动应用需要付费许可证。 故障排除 如果你的AVideo主页未能加载一些CSS和JavaScript资源, 很可能您在Apache或Nginx虚拟主机文件中为web根目录添加了额外的正斜杠。而不是使用 DocumentRoot /var/www/AVideo/ 你应该使用 DocumentRoot /var/www/AVideo 如果主网站工作不正常,可以查看日志文件/var/www/AVideo/videos/youphptube。日志如果编码器工作不正常,可以在/var/www/AVideo/upload/videos/youphptube上查看日志文件。日志 其他花絮 编码视频时,可以选择分辨率(低分辨率、SD分辨率、HD分辨率)。如果你使用AVideo作为个人视频流网站,我建议你只选择高清分辨率,以减少编码时间和节省磁盘空间。如果您已经将视频编码为所有3种分辨率,则可以转到AVideo视频目录(/var/www/AVideo/videos),删除低分辨率和SD分辨率的视频。 cd /var/www/AVideo/videos/ sudo rm *Low.mp4 sudo rm *SD.mp4 如何从视频网站下载所有视频 您可以使用youtube dl命令行实用程序下载所有视频。首先,你需要转到AVideo dashboard,然后转到视频列表页面并向下滚动到底部,单击下载视频列表(permalink.txt文件)按钮。您将看到所有视频的URL列表。 接下来,打开一个终端,用文本编辑器创建一个txt文件,从网页复制URL并粘贴到文件中。然后可以运行以下命令下载视频。替换视频列表。使用您自己的文件名。 youtube-dl -a video-list.txt 收尾 我希望本教程能帮助您在Ubuntu 20.04服务器上安装AVideo。和往常一样,如果你觉得这篇文章很有用,那么订阅我们的免费时事通讯以获得更多提示和窍门。当心?

    2022.03.23 浏览:700