Audio 基于RTP协议的FFmpeg-RTP\u-Mpegts

Audio 基于RTP协议的FFmpeg-RTP\u-Mpegts,audio,ffmpeg,udp,rtp,mpeg2-ts,Audio,Ffmpeg,Udp,Rtp,Mpeg2 Ts,我正在尝试实现一个基于FFmpeg的客户机/服务器应用程序。不幸的是,RTP_MPEGTS没有在官方文件中记录。 不管怎样,我从中找到了灵感 服务器端 (1) 捕获麦克风音频作为输入。(2) 将其编码为pcm 8khz单声道,并(3)通过RTP协议以RTP_MPEGTS格式在本地发送 ffmpeg -f avfoundation -i none:2 -ar 8000 -acodec pcm_u8 -ac 1 -f rtp_mpegts rtp://127.0.0.1:41954 这是可行的

我正在尝试实现一个基于FFmpeg的客户机/服务器应用程序。不幸的是,RTP_MPEGTS没有在官方文件中记录。 不管怎样,我从中找到了灵感

服务器端

(1) 捕获麦克风音频作为输入。(2) 将其编码为pcm 8khz单声道,并(3)通过RTP协议以RTP_MPEGTS格式在本地发送

ffmpeg -f avfoundation -i none:2  -ar 8000 -acodec pcm_u8 -ac 1 -f rtp_mpegts rtp://127.0.0.1:41954
  • 这是可行的,但在启动时它会发出警报“[mpegts@0x7fda13024600]帧大小未设置”
客户端(在同一台机器上)

(1) 接收rtp音频流输入(2)将其写入文件或播放

ffmpeg -i rtp://127.0.0.1:41954 -vcodec copy -y "output.wav"
  • 我正在使用
    -vcodec copy
    ,因为我已经在另一个rtp流中验证了它,而
    -acodec copy
    在该流中不起作用
  • 此选项被卡住,在使用Ctrl+C快捷键关闭时,它会打印:

    Input #0, rtp, from 'rtp://127.0.0.1:41954':
    Duration: N/A, start: 8.956122, bitrate: N/A
    Program 1 
    Metadata:
      service_name    : Service01
      service_provider: FFmpeg
    Stream #0:0: Data: bin_data ([6][0][0][0] / 0x0006)
    Output #0, wav, to 'output.wav':
    Output file #0 does not contain any stream
    

  • 我不明白客户端是否没有收到任何流,或者它无法将rtp数据包写入“output.wav”文件。(客户端或服务器问题?)
  • 在中,解释了一种变通方法。服务器上可以运行2个ffmpeg实例: 一个由于mpegts而生成“tmp.ts”文件,另一个将“tmp.ts”作为输入并通过rtp流式传输。可能吗

  • 有没有更好的方法以尽可能低的延迟实现此客户机/服务器



  • 感谢您提供的帮助。

    我使用
    .aac
    文件对此进行了测试,结果显示:

    流媒体:

    ffmpeg -y -i "rtp://239.1.1.9:1234" -c:a pcm_u8 "captured_stream.wav"
    
    (注意,我使用多播地址

    但是如果在同一台机器上测试流式传输和接收,则可以使用
    127.0.0.1
    作为本地主机的环回地址。)

    您需要
    rtp\u mpegts
    muxer的视频源。我用
    lavfi
    创建了一个

    我使用
    -stream\u loop
    永久循环
    .aac
    文件进行测试。你不需要用麦克风作为输入

    捕获流:

    ffmpeg -y -i "rtp://239.1.1.9:1234" -c:a pcm_u8 "captured_stream.wav"
    
    我在故意捕获时使用了
    -c:a pcm_u8
    ,因为在流中使用它在捕获端不起作用


    输出是一个低质量的
    8bit
    8kHz
    mono
    音频文件,但这正是您所要求的。

    也许您应该在
    -i…
    之前添加接收机端
    -probesize 10M
    -analyzeduration 10M
    。AFAIK udp和rtp几乎是一样的,如果您发现在Mpegts和udp中发送方-接收方线路可以按照您的需要工作,只需将
    mpeg\u ts
    更改为
    rtp\u Mpegts
    ,将
    udp
    更改为
    rtp