一个可用的短视频分发系统核心由三部分构成:视频处理服务、内容分发网络和播放器客户端。本指南将指导你搭建一个支持上传、转码、存储与播放的基础系统。
确保你已准备好以下环境,这是后续所有操作的基础。
在服务器上依次执行以下命令完成安装。
步骤一:安装Docker
``` sudo yum install -y yum-utils sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo yum install -y docker-ce docker-ce-cli containerd.io sudo systemctl start docker sudo systemctl enable docker ```步骤二:安装Docker Compose
``` sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose ```执行docker-compose --version验证安装成功。
我们将使用开源项目FFmpeg进行视频转码,并用MinIO模拟对象存储进行开发测试。
创建docker-compose.yml文件,内容如下:
``` version: '3.8' services: minio: image: minio/minio:latest container_name: minio ports: - "9000:9000" API端口 - "9001:9001" 控制台端口 environment: MINIO_ROOT_USER: admin 默认管理账号 MINIO_ROOT_PASSWORD: admin123456 请修改为强密码 volumes: - ./minio_data:/data command: server /data --console-address ":9001" restart: unless-stopped ```在文件所在目录执行docker-compose up -d启动服务。访问http://你的服务器IP:9001,使用上面配置的账号密码登录。
登录后,在控制台创建一个名为"videos"的Bucket。
创建一个Python脚本video_processor.py,使用FFmpeg进行转码并上传到MinIO。
步骤一:安装Python依赖
``` pip install boto3 moviepy ```步骤二:编写处理脚本核心代码
``` import os import boto3 from moviepy.editor import VideoFileClip from botocore.client import Config MinIO连接配置 ENDPOINT = 'http://你的服务器IP:9000' ACCESS_KEY = 'admin' SECRET_KEY = 'admin123456' BUCKET_NAME = 'videos' s3_client = boto3.client('s3', endpoint_url=ENDPOINT, aws_access_key_id=ACCESS_KEY, aws_secret_access_key=SECRET_KEY, config=Config(signature_version='s3v4')) def upload_to_s3(file_path, object_name): """上传文件到对象存储""" try: s3_client.upload_file(file_path, BUCKET_NAME, object_name) print(f"上传成功: {object_name}") return f"{ENDPOINT}/{BUCKET_NAME}/{object_name}" except Exception as e: print(f"上传失败: {e}") return None def process_video(input_path, output_dir): """视频转码处理""" 确保输出目录存在 os.makedirs(output_dir, exist_ok=True) 定义输出格式:转码为H.264编码的MP4,适配网页播放 output_name = os.path.splitext(os.path.basename(input_path))[0] + '_converted.mp4' output_path = os.path.join(output_dir, output_name) 使用FFmpeg命令进行转码(通过moviepy调用) clip = VideoFileClip(input_path) 调整视频尺寸,确保宽度不超过1280像素,保持宽高比 clip_resized = clip.resize(width=1280) if clip.w > 1280 else clip 写入文件,使用libx264编码,码率控制为1Mbps clip_resized.write_videofile(output_path, codec='libx264', audio_codec='aac', bitrate='1000k') clip.close() clip_resized.close() print(f"转码完成: {output_path}") return output_path if __name__ == "__main__": 示例:处理本地视频并上传 local_video = "/tmp/example_video.mp4" 请替换为你的视频文件路径 temp_dir = "/tmp/processed_videos" processed_path = process_video(local_video, temp_dir) if processed_path: object_name = "videos/" + os.path.basename(processed_path) file_url = upload_to_s3(processed_path, object_name) if file_url: print(f"视频最终访问地址: {file_url}") ```
将脚本中的ENDPOINT、ACCESS_KEY等配置替换为你的实际信息。此脚本完成了视频转码和上传的核心流程。
处理后的视频存储在对象存储中,我们需要通过CDN加速分发,并提供一个网页播放器供用户观看。
如果你使用腾讯云COS,可以无缝对接CDN。
配置完成后,你的视频地址将从https://your-bucket.cos.ap-guangzhou.myqcloud.com/video.mp4 变为 https://video.yourdomain.com/video.mp4,并通过CDN节点加速。
使用开源的DPlayer,创建一个简单的HTML播放页player.html。
```将此文件部署到你的Web服务器(如Nginx)根目录。用户访问http://你的域名/player.html?video=你的CDN视频地址即可播放。
将以上组件串联,形成一个从上传到播放的完整闭环。
使用Flask创建一个简单的HTTP上传接口upload_server.py。
``` from flask import Flask, request, jsonify import os from werkzeug.utils import secure_filename from video_processor import process_video, upload_to_s3 导入之前写的处理函数 app = Flask(__name__) app.config['UPLOAD_FOLDER'] = '/tmp/uploads' app.config['MAX_CONTENT_LENGTH'] = 500 1024 1024 限制500MB ALLOWED_EXTENSIONS = {'mp4', 'avi', 'mov', 'mkv'} def allowed_file(filename): return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS @app.route('/upload', methods=['POST']) def upload_file(): if 'file' not in request.files: return jsonify({'error': '没有文件部分'}), 400 file = request.files['file'] if file.filename == '': return jsonify({'error': '未选择文件'}), 400 if file and allowed_file(file.filename): filename = secure_filename(file.filename) upload_path = os.path.join(app.config['UPLOAD_FOLDER'], filename) os.makedirs(app.config['UPLOAD_FOLDER'], exist_ok=True) file.save(upload_path) 处理视频并上传 processed_path = process_video(upload_path, '/tmp/processed') if processed_path: object_name = "videos/" + os.path.basename(processed_path) file_url = upload_to_s3(processed_path, object_name) 清理临时文件 os.remove(upload_path) os.remove(processed_path) if file_url: 将返回的MinIO地址替换为你的CDN域名 cdn_url = file_url.replace('http://你的服务器IP:9000/videos', 'https://video.yourdomain.com') return jsonify({'url': cdn_url}), 200 return jsonify({'error': '视频处理失败'}), 500 else: return jsonify({'error': '文件类型不允许'}), 400 if __name__ == '__main__': app.run(host='0.0.0.0', port=5000, debug=True) ```运行python upload_server.py启动服务。现在你可以使用Postman或curl向http://你的服务器IP:5000/upload发送POST请求上传视频,接口将返回通过CDN加速的可播放地址。
打开终端,使用curl命令测试:
``` curl -X POST -F "file=@/path/to/your/video.mp4" http://你的服务器IP:5000/upload ```如果一切正常,你将收到一个JSON响应,包含类似https://video.yourdomain.com/videos/your_video_converted.mp4的URL。将此URL作为参数填入播放器页面即可观看。
以上系统已可运行,但要用于生产,还需进行以下关键优化。
按照本指南的步骤,你已经搭建了一个具备核心功能的短视频分发系统。从环境准备、服务搭建到流程串联,每个步骤都提供了可直接执行的代码和配置。接下来,你可以基于此基础,根据实际业务需求进行功能扩展和性能优化。
易频IT社区是综合性互联网IT技术门户网站,专注分享网络技术、服务器运维、网络安全、编程开发、系统架构、云计算、大数据等行业干货,实时更新IT行业资讯、零基础教程、实战案例,为IT从业者、技术爱好者提供专业的学习交流平台。
Copyright © 2021-2026 易频IT社区. All Rights Reserved. 备案号:闽ICP备2023013482号 网站地图