You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

树莓派通过Python向Jetson NX传输实时视频报错求助

解决树莓派到Jetson NX实时视频传输的ffmpeg管道格式错误

错误原因

你的ffmpeg命令仅指定输出到管道-,但未明确输出格式和视频编码参数。ffmpeg无法通过管道自动推断输出格式,因此抛出Unable to find a suitable output format for 'pipe:'错误。

修正后的服务器代码(树莓派端)

关键是为ffmpeg添加编码和输出格式参数,适配流式传输场景:

import subprocess
import socket

HOST = '192.168.43.42'  # Host IP address
PORT = 5001  # Port number
WIDTH = 640  # Width of the video frame
HEIGHT = 480  # Height of the video frame
BITRATE = '1000k'  # 改用k单位更符合ffmpeg习惯,对应原1000000比特率

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind((HOST, PORT))
server_socket.listen(1)
print('Server listening on port', PORT)

# 修正后的ffmpeg命令:明确编码、输出格式,优化实时传输
ffmpeg_cmd = [
    'ffmpeg',
    '-f', 'v4l2',
    '-framerate', '30',
    '-video_size', f'{WIDTH}x{HEIGHT}',
    '-input_format', 'mjpeg',
    '-i', '/dev/video0',
    '-c:v', 'libx264',          # 指定H.264编码,适合网络传输
    '-f', 'mpegts',             # 明确输出格式为MPEG-TS,流媒体专用封装
    '-preset', 'faster',        # 平衡编码速度和质量
    '-tune', 'zerolatency',     # 优化实时传输,减少延迟
    '-b:v', BITRATE,            # 设置视频码率
    '-'                         # 输出到管道
]

ffmpeg_proc = subprocess.Popen(ffmpeg_cmd, stdout=subprocess.PIPE)
connection, client_address = server_socket.accept()
print('Client connected:', client_address)

try:
    while True:
        # 读取ffmpeg输出并发送到客户端
        data = ffmpeg_proc.stdout.read(1024)
        if not data:
            break
        connection.sendall(data)
finally:
    ffmpeg_proc.terminate()  # 用terminate替代kill,更优雅
    connection.close()
    server_socket.close()

Jetson NX端接收播放代码示例

需要用ffmpeg接收socket数据并解码播放,可写一个简单的Python客户端:

import socket
import subprocess

HOST = '192.168.43.42'  # 树莓派IP
PORT = 5001

client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect((HOST, PORT))

# 调用ffmpeg接收流并播放
ffmpeg_cmd = [
    'ffmpeg',
    '-i', '-',  # 从管道读取输入
    '-c:v', 'h264',
    '-f', 'xv',  # 适配Jetson的显示输出,也可用'auto'自动识别
    '-'
]

ffmpeg_proc = subprocess.Popen(ffmpeg_cmd, stdin=subprocess.PIPE)

try:
    while True:
        data = client_socket.recv(1024)
        if not data:
            break
        ffmpeg_proc.stdin.write(data)
        ffmpeg_proc.stdin.flush()
finally:
    ffmpeg_proc.terminate()
    client_socket.close()

关键参数说明

  • -f mpegts:MPEG-TS是流媒体场景的标准封装格式,能保证数据分段传输时的完整性,ffmpeg可直接识别管道输出的该格式
  • -tune zerolatency:禁用编码缓存,大幅降低延迟,是实时视频传输的必备参数
  • -preset faster:牺牲少量编码质量换取更快的编码速度,适配树莓派的硬件性能

内容的提问来源于stack exchange,提问作者Giuseppe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 06:35:37