树莓派通过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
相关产品推荐
相关产品推荐

