52 lines
1.3 KiB
Python
52 lines
1.3 KiB
Python
import asyncio
|
|
import subprocess
|
|
import websockets
|
|
from fastapi import FastAPI, WebSocket, WebSocketDisconnect
|
|
|
|
app = FastAPI()
|
|
|
|
# 管理推拉流的 ffmpeg 子进程
|
|
processes = {}
|
|
|
|
def start_stream(input_url: str, output_url: str):
|
|
command = [
|
|
"ffmpeg",
|
|
"-i", input_url,
|
|
"-c:v", "libx264",
|
|
"-c:a", "aac",
|
|
"-f", "flv",
|
|
output_url
|
|
]
|
|
process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
|
processes[output_url] = process
|
|
return process
|
|
|
|
def stop_stream(output_url: str):
|
|
process = processes.pop(output_url, None)
|
|
if process:
|
|
process.terminate()
|
|
|
|
# WebSocket 心跳检测
|
|
@app.websocket("/ws")
|
|
async def websocket_endpoint(websocket: WebSocket):
|
|
await websocket.accept()
|
|
try:
|
|
while True:
|
|
message = await websocket.receive_text()
|
|
if message == "ping":
|
|
await websocket.send_text("pong")
|
|
except WebSocketDisconnect:
|
|
print("WebSocket disconnected")
|
|
|
|
# 启动推流示例
|
|
@app.post("/start-stream")
|
|
def start(input_url: str, output_url: str):
|
|
process = start_stream(input_url, output_url)
|
|
return {"message": "Stream started", "pid": process.pid}
|
|
|
|
# 停止推流示例
|
|
@app.post("/stop-stream")
|
|
def stop(output_url: str):
|
|
stop_stream(output_url)
|
|
return {"message": "Stream stopped"}
|