首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ffmpeg amerge和amix滤波器延迟

ffmpeg amerge和amix滤波器延迟
EN

Stack Overflow用户
提问于 2015-10-29 20:42:42
回答 2查看 4.3K关注 0票数 1

我需要从几个IP摄像机中获取音频流,并将它们合并到一个文件中,这样它们听起来就会相同。

我试着过滤"amix":(为了测试的目的,我从同一个摄像头上取了2次音频流。是的,我试了两个摄像头-结果是一样的)

代码语言:javascript
复制
ffmpeg -i rtsp://user:pass@172.22.5.202 -i rtsp://user:pass@172.22.5.202 -map 0:a -map 1:a  -filter_complex amix=inputs=2:duration=first:dropout_transition=3  -ar 22050 -vn -f flv rtmp://172.22.45.38:1935/live/stream1

结果:我说“你好”。在扬声器中听到第一个"hello“,在一秒内我听到第二个"hello”。而不是同时听到两个“你好”。

并尝试过滤"amerge":

代码语言:javascript
复制
ffmpeg -i rtsp://user:pass@172.22.5.202 -i rtsp://user:pass@172.22.5.202 -map 0:a -map 1:a  -filter_complex amerge -ar 22050 -vn -f flv rtmp://172.22.45.38:1935/live/stream1

结果:与第一个示例相同,但现在我在左侧扬声器中听到第一个"hello“,在1秒内在右侧扬声器中听到第二个"hello”,而不是同时在两个扬声器中听到两个“hello”。

所以,问题是:如何让它们听起来也一样呢?你可能知道一些参数?或者其他命令?

附注:如果你需要的话,下面是两个变种的完整命令行输出:

代码语言:javascript
复制
[root@minjust ~]# ffmpeg -i rtsp://admin:12345@172.22.5.202 -i rtsp://admin:12345@172.22.5.202 -map 0:a -map 1:a -filter_complex amix=inputs=2:duration=longest:dropout_transition=0 -vn -ar 22050 -f flv rtmp://172.22.45.38:1935/live/stream1       ffmpeg version N-76031-g9099079 Copyright (c) 2000-2015 the FFmpeg developers
  built with gcc 4.4.7 (GCC) 20120313 (Red Hat 4.4.7-16)
  configuration: --enable-gpl --enable-libx264 --enable-libmp3lame --enable-nonfree --enable-version3
  libavutil      55.  4.100 / 55.  4.100
  libavcodec     57.  6.100 / 57.  6.100
  libavformat    57.  4.100 / 57.  4.100
  libavdevice    57.  0.100 / 57.  0.100
  libavfilter     6. 11.100 /  6. 11.100
  libswscale      4.  0.100 /  4.  0.100
  libswresample   2.  0.100 /  2.  0.100
  libpostproc    54.  0.100 / 54.  0.100
Input #0, rtsp, from 'rtsp://admin:12345@172.22.5.202':
  Metadata:
    title           : Media Presentation
  Duration: N/A, start: 0.032000, bitrate: N/A
    Stream #0:0: Video: h264 (Baseline), yuv420p, 1280x720, 20 fps, 25 tbr, 90k tbn, 40 tbc
    Stream #0:1: Audio: adpcm_g726, 8000 Hz, mono, s16, 16 kb/s
    Stream #0:2: Data: none
Input #1, rtsp, from 'rtsp://admin:12345@172.22.5.202':
  Metadata:
    title           : Media Presentation
  Duration: N/A, start: 0.032000, bitrate: N/A
    Stream #1:0: Video: h264 (Baseline), yuv420p, 1280x720, 20 fps, 25 tbr, 90k tbn, 40 tbc
    Stream #1:1: Audio: adpcm_g726, 8000 Hz, mono, s16, 16 kb/s
    Stream #1:2: Data: none
Output #0, flv, to 'rtmp://172.22.45.38:1935/live/stream1':
  Metadata:
    title           : Media Presentation
    encoder         : Lavf57.4.100
    Stream #0:0: Audio: mp3 (libmp3lame) ([2][0][0][0] / 0x0002), 22050 Hz, mono, fltp (default)
    Metadata:
      encoder         : Lavc57.6.100 libmp3lame
Stream mapping:
  Stream #0:1 (g726) -> amix:input0
  Stream #1:1 (g726) -> amix:input1
  amix -> Stream #0:0 (libmp3lame)
Press [q] to stop, [?] for help
[rtsp @ 0x2689600] Thread message queue blocking; consider raising the thread_queue_size option (current value: 8)
[rtsp @ 0x2727c60] Thread message queue blocking; consider raising the thread_queue_size option (current value: 8)
[rtsp @ 0x2689600] max delay reached. need to consume packet
[NULL @ 0x268c500] RTP: missed 38 packets
[rtsp @ 0x2689600] max delay reached. need to consume packet
[NULL @ 0x268d460] RTP: missed 4 packets
[flv @ 0x2958360] Failed to update header with correct duration.
[flv @ 0x2958360] Failed to update header with correct filesize.
size=      28kB time=00:00:06.18 bitrate=  36.7kbits/s
video:0kB audio:24kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 16.331224%

和amerge:

代码语言:javascript
复制
[root@minjust ~]# ffmpeg -i rtsp://admin:12345@172.22.5.202 -i rtsp://admin:12345@172.22.5.202 -map 0:a -map 1:a -filter_complex amerge -vn -ar 22050 -f flv rtmp://172.22.45.38:1935/live/stream1
ffmpeg version N-76031-g9099079 Copyright (c) 2000-2015 the FFmpeg developers
  built with gcc 4.4.7 (GCC) 20120313 (Red Hat 4.4.7-16)
  configuration: --enable-gpl --enable-libx264 --enable-libmp3lame --enable-nonfree --enable-version3
  libavutil      55.  4.100 / 55.  4.100
  libavcodec     57.  6.100 / 57.  6.100
  libavformat    57.  4.100 / 57.  4.100
  libavdevice    57.  0.100 / 57.  0.100
  libavfilter     6. 11.100 /  6. 11.100
  libswscale      4.  0.100 /  4.  0.100
  libswresample   2.  0.100 /  2.  0.100
  libpostproc    54.  0.100 / 54.  0.100
Input #0, rtsp, from 'rtsp://admin:12345@172.22.5.202':
  Metadata:
    title           : Media Presentation
  Duration: N/A, start: 0.064000, bitrate: N/A
    Stream #0:0: Video: h264 (Baseline), yuv420p, 1280x720, 20 fps, 25 tbr, 90k tbn, 40 tbc
    Stream #0:1: Audio: adpcm_g726, 8000 Hz, mono, s16, 16 kb/s
    Stream #0:2: Data: none
Input #1, rtsp, from 'rtsp://admin:12345@172.22.5.202':
  Metadata:
    title           : Media Presentation
  Duration: N/A, start: 0.032000, bitrate: N/A
    Stream #1:0: Video: h264 (Baseline), yuv420p, 1280x720, 20 fps, 25 tbr, 90k tbn, 40 tbc
    Stream #1:1: Audio: adpcm_g726, 8000 Hz, mono, s16, 16 kb/s
    Stream #1:2: Data: none
[Parsed_amerge_0 @ 0x3069cc0] No channel layout for input 1
[Parsed_amerge_0 @ 0x3069cc0] Input channel layouts overlap: output layout will be determined by the number of distinct input channels
Output #0, flv, to 'rtmp://172.22.45.38:1935/live/stream1':
  Metadata:
    title           : Media Presentation
    encoder         : Lavf57.4.100
    Stream #0:0: Audio: mp3 (libmp3lame) ([2][0][0][0] / 0x0002), 22050 Hz, stereo, s16p (default)
    Metadata:
      encoder         : Lavc57.6.100 libmp3lame
Stream mapping:
  Stream #0:1 (g726) -> amerge:in0
  Stream #1:1 (g726) -> amerge:in1
  amerge -> Stream #0:0 (libmp3lame)
Press [q] to stop, [?] for help
[rtsp @ 0x2f71640] Thread message queue blocking; consider raising the thread_queue_size option (current value: 8)
[rtsp @ 0x300fb40] Thread message queue blocking; consider raising the thread_queue_size option (current value: 8)
[rtsp @ 0x2f71640] max delay reached. need to consume packet
[NULL @ 0x2f744a0] RTP: missed 18 packets
[flv @ 0x3058b00] Failed to update header with correct duration.
[flv @ 0x3058b00] Failed to update header with correct filesize.
size=      39kB time=00:00:04.54 bitrate=  70.2kbits/s
video:0kB audio:36kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 8.330614%

谢谢。

更新2015年10月30日:我在连接两个摄像头时发现了有趣的细节(它们有不同的麦克风,我听到了它们之间的区别):来自不同摄像头的“Hello”的顺序取决于输入的顺序。

代码语言:javascript
复制
ffmpeg -i rtsp://cam2 -i rtsp://cam1 -map 0:a -map 1:a -filter_complex amix=inputs=2:duration=longest:dropout_transition=0 -vn -ar 22050 -f flv rtmp://172.22.45.38:1935/live/stream1

我从第一个凸轮听到"hello“,然后在1秒内从第二个凸轮听到"hello”。

使用命令

代码语言:javascript
复制
ffmpeg -i rtsp://cam1 -i rtsp://cam2 -map 0:a -map 1:a -filter_complex amix=inputs=2:duration=longest:dropout_transition=0 -vn -ar 22050 -f flv rtmp://172.22.45.38:1935/live/stream1

我从第二个凸轮听到“你好”,然后在1秒内从第一个凸轮听到“你好”。

因此,据我所知- ffmpeg不是以同样的方式接受输入,而是按照给定的输入顺序。问:如何告诉ffmpeg同时读取输入?

EN

回答 2

Stack Overflow用户

发布于 2015-10-30 22:46:33

如果使用两个本地文件的混音效果很好,你就不能一次播放两个音频。

当输入来自本地文件或流时,ffmpeg确切地知道它的开始时间。所以它可以被混合到一个音频中。

但是当输入来自直播流时,ffmpeg不知道确切的“何时开始”,所以不同的流地址的开始时间应该是不同的。

更重要的是,ffmpeg在处理输入时不支持并发。这就是为什么"hello“的顺序取决于输入的顺序。

我只知道一个解决方案。Adobe FMLE(Flash Media Live Encoder),在使用RTMP流时支持时间码。你可以从两个直播流中获取时间代码,然后最终可以将两个音频混合为一个音频。

也许您可以从这篇文章开始:http://www.overdigital.com/2013/03/25/3ways-to-sync-data/

票数 0
EN

Stack Overflow用户

发布于 2016-02-10 14:10:37

试一试

代码语言:javascript
复制
ffmpeg -i rtsp://user:pass@172.22.5.202 -i rtsp://user:pass@172.22.5.202 \
-filter_complex \
"[0:a]asetpts=PTS-STARTPTS[a1];[1:a]asetpts=PTS-STARTPTS[a2]; \
 [a1][a2]amix=inputs=2:duration=first:dropout_transition=3[a] \
-map [a] -ar 22050 -vn -f flv rtmp://172.22.45.38:1935/live/stream1
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33414590

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档