ℳঞ ꦿ俗人 ໌້ᮨ꧔ꦿ᭄ 2024-06-11 21:37 采纳率: 0%
浏览 808

使用ffmpeg,rtmp推流,出现Connection to tcp://localhost:1935?tcp_nodelay=0 failed: Error number -138问题

**使用ffmpeg,rtmp推流,出现Connection to tcp://localhost:1935?tcp_nodelay=0 failed: Error number -138问题
**
代码如下:

import subprocess as sp

# 定义本地视频文件路径
video_file_path = 'input.mp4'

# 定义RTMP服务器地址和端口
rtmp_url = 'rtmp://localhost:1935'

# 构建FFmpeg命令
ffmpeg_cmd = [
     'ffmpeg',
     '-re',  # 以实时速度读取输入
     '-i', video_file_path,  # 输入文件路径
     '-c:v', 'copy',  # 视频编码器,这里使用copy表示不重新编码
     '-an',

     '-f', 'flv',
     rtmp_url  # RTMP服务器地址和流名称
]

# 执行FFmpeg命令
process = sp.Popen(ffmpeg_cmd, stdout=sp.PIPE, stderr=sp.PIPE)

# 获取FFmpeg的输出和错误信息
stdout, stderr = process.communicate()

# 打印FFmpeg的输出信息
if process.returncode == 0:
    print("视频推流成功")
else:
    print("FFmpeg命令执行失败,错误信息如下:")
    print(stderr.decode())

img

  • 写回答

3条回答 默认 最新

  • 阿里嘎多学长 2024-06-11 21:37
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    错误代码 -138 在 FFmpeg 中通常表示网络连接问题,特别是与 RTMP 服务器的连接问题。根据您提供的日志信息和代码,这里有几个可能的原因和解决方案:

    1. RTMP服务器未运行:确保您的 RTMP 服务器正在运行并且监听在端口 1935 上。您可以使用 netstatlsof 命令来检查端口是否被占用。

    2. 防火墙或网络限制:检查您的防火墙设置或网络配置,确保没有阻止到 localhost:1935 的连接。

    3. 错误的RTMP URL格式:在您的代码中,rtmp_url 变量应该包含流名称,例如 rtmp://localhost:1935/live/streamName。确保流名称是正确的,并且服务器端配置了相应的路径。

    4. FFmpeg参数问题:在您的代码中,-an 参数用于忽略音频流,如果输入文件包含音频,这应该不会导致 -138 错误,但请确保这是您想要的行为。

    5. 错误的tcp_nodelay设置tcp_nodelay=0 尝试设置 TCP_NODELAY 选项,但这个设置可能不适用于所有情况。您可以尝试去掉 ?tcp_nodelay=0 部分,让 FFmpeg 使用默认设置。

    6. Python subprocess调用问题:确保 subprocess.Popen 调用正确,并且没有因为编码问题导致错误。您可能需要检查 stderr 的输出来获取更多错误信息。

    针对您的问题,以下是一些代码实现和参考资料的建议:

    代码实现

    • 确保 RTMP 服务器地址和端口正确。
    • 检查 FFmpeg 命令是否正确执行,包括所有参数。
    # 确保流名称是正确的
    rtmp_url = 'rtmp://localhost:1935/live/streamName'
    
    # 构建FFmpeg命令,去掉了tcp_nodelay的设置
    ffmpeg_cmd = [
        'ffmpeg',
        '-re',
        '-i', video_file_path,
        '-c:v', 'copy',
        '-an',
        '-f', 'flv',
        rtmp_url
    ]
    
    # 执行FFmpeg命令,并捕获错误信息
    try:
        process = sp.Popen(ffmpeg_cmd, stdout=sp.PIPE, stderr=sp.PIPE)
        stdout, stderr = process.communicate()
        if process.returncode != 0:
            raise Exception(stderr.decode())
        print("视频推流成功")
    except Exception as e:
        print("FFmpeg命令执行失败,错误信息如下:")
        print(e)
    

    参考资料

    请注意,这些解决方案可能需要根据您的具体环境和配置进行调整。如果问题仍然存在,您可能需要提供更多的信息,例如 RTMP 服务器的日志,以便进一步诊断问题。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 6月11日