[Python] ffmpeg video streaming issue

Discussão em 'Python' iniciado por Stack, Abril 20, 2025.

  1. Stack

    Stack Membro Participativo

    I am trying to embed an adb video stream into an html site with flask, and the code I have keeps on returning this same error:

    FFmpeg: [mjpeg @ 0x156631c10] Could not find codec parameters for stream 0 (Video: mjpeg, none(bt470bg/unknown/unknown)): unspecified size FFmpeg: Consider increasing the value for the 'analyzeduration' (1000000) and 'probesize' (5000000) options FFmpeg: Input #0, mjpeg, from 'pipe:0': FFmpeg: Duration: N/A, bitrate: N/A FFmpeg: Stream #0:0: Video: mjpeg, none(bt470bg/unknown/unknown), 25 fps, 1200k tbr, 1200k tbn FFmpeg: Output #0, mpegts, to 'pipe:1': FFmpeg: [out#0/mpegts @ 0x156632110] Output file does not contain any stream FFmpeg: Error opening output file pipe:1. FFmpeg: Error opening output files: Invalid argument

    this is my code:


    from flask import Flask, Response
    import subprocess
    import json
    import threading

    app = Flask(__name__)

    with open("data_file.json", "r") as f:
    config_data = json.load(f)

    user = config_data["Users"]["Test User 1"]


    def log_ffmpeg_errors(proc):
    for line in iter(proc.stderr.readline, b''):
    if line:
    print("FFmpeg:", line.decode(), end='')


    def connect_device(ip, port):
    try:
    # Reconnect if device is offline
    subprocess.run(["adb", "tcpip", str(port)])
    subprocess.run(["adb", "connect", ip])
    # Check if the device is online
    devices = subprocess.check_output(["adb", "devices"]).decode()
    if "offline" in devices:
    raise Exception("Device is offline")
    except Exception as e:
    print(f"Error connecting device: {e}")


    def generate_video_stream():
    adb_cmd = ["adb", "exec-out", "screenrecord", "--output-format=mjpeg"] # Use MJPEG output
    ffmpeg_cmd = [
    "ffmpeg",
    "-f", "mjpeg",
    "-analyzeduration", "1000000",
    "-probesize", "5000000",
    "-i", "pipe:0",
    "-q:v", "5",
    "-r", "10",
    "-vcodec", "mjpeg",
    "-s", "1280x720",
    "-f", "mpegts",
    "pipe:1"
    ]

    adb_proc = subprocess.Popen(adb_cmd, stdout=subprocess.PIPE)
    ffmpeg_proc = subprocess.Popen(ffmpeg_cmd, stdin=adb_proc.stdout, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

    threading.Thread(target=log_ffmpeg_errors, args=(ffmpeg_proc,), daemon=True).start()

    try:
    while True:
    frame = ffmpeg_proc.stdout.read(4096)
    if not frame:
    break
    yield (b'--frame\r\n'
    b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n')

    finally:
    adb_proc.terminate()
    ffmpeg_proc.terminate()

    @app.route('/video_feed')
    def video_feed():
    return Response(generate_video_stream(), mimetype='multipart/x-mixed-replace; boundary=frame')

    if __name__ == "__main__":
    connect_device(user["IP"], user["port"])
    app.run(debug=True, host='0.0.0.0', port=8080)

    Continue reading...

Compartilhe esta Página