2015-10-29 3 views
0

J'ai besoin de prendre des flux audio de plusieurs caméras IP et de les fusionner en un seul fichier, de sorte qu'ils sonnent simaltaneousely.ffmpeg amerge et amix filter delay

J'ai essayé filtre « amix »: (à des fins de test je prends flux audio 2 fois de la même caméra oui, j'ai essayé 2 caméras - résultat est le même.)

ffmpeg -i rtsp://user:[email protected] -i rtsp://user:[email protected] -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 

résultat: Je dis "Bonjour". Et entendre dans les haut-parleurs le premier "bonjour" et en 1 seconde j'entends le deuxième "bonjour". Au lieu d'entendre deux "bonjour" simaltaneousely.

et filtre essayé « Amerge »:

ffmpeg -i rtsp://user:[email protected] -i rtsp://user:[email protected] -map 0:a -map 1:a -filter_complex amerge -ar 22050 -vn -f flv rtmp://172.22.45.38:1935/live/stream1 

résultat: le même que dans le premier exemple, mais maintenant j'entends le premier « bonjour » en haut-parleur gauche et en 1 seconde j'entends le second « bonjour "dans le haut-parleur droit, au lieu d'entendre deux" bonjour "dans les deux enceintes simaltaneousely. Donc, la question est: comment les faire sonner simultanément? Peut-être connaissez-vous un paramètre? ou une autre commande?

P.S. Voici la sortie de ligne de commande FUL pour les deux variantes si vous avez besoin: amix:

[[email protected] ~]# ffmpeg -i rtsp://admin:[email protected] -i rtsp://admin:[email protected] -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:[email protected]': 
    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:[email protected]': 
    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% 

et Amerge:

[[email protected] ~]# ffmpeg -i rtsp://admin:[email protected] -i rtsp://admin:[email protected] -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:[email protected]': 
    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:[email protected]': 
    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% 

Thanx.

MISE À JOUR 30 oct 2015: J'ai trouvé des détails intéressants lors de la connexion de 2 caméras (ils ont des microphones différents et j'entends la différence): l'ordre des "Hello" dépend de l'ORDRE DES ENTRÉES. avec commande

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 

J'entends « bonjour » de 1ère came et puis en 1 seconde « bonjour » de la came 2.

avec commande

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 

J'entends « bonjour » de 2ème came et puis en 1 seconde « bonjour » de 1ère came. Donc, comme je comprends - ffmpeg prend des entrées pas simaltaneousely, mais dans l'ordre des entrées données. Question: comment dire à ffmpeg de lire les entrées simultanément?

+1

Avez-vous testé avec fichier local, pas l'entrée en continu? –

+0

oui, mais je n'ai pas fait attention à retarder. Qu'est-ce que ça va nous donner? même s'il n'y a pas de retard avec les "fichiers d'entrée" - j'ai besoin de "pas de retard" avec les flux. Quoi qu'il en soit, le premier "bonjour" de la caméra est syncronisé avec la vidéo de la même caméra. Mais le deuxième "bonjour" - tiré de la même caméra - est en retard. ((( –

+0

bien, j'ai essayé de mélanger deux fichiers identiques 1.mp3 et 2.mp3 (c'est le même fichier avec des noms différents) ----- ffmpeg -i D: \ 1.mp3 -i D: \ 1. mp3 -filter_complex amix = entrées = 2: durée = premier: dropout_transition = 3 -ar 22050 -vn -f flv D: \ 3.flv ----- - le résultat est parfait alors, comment ça nous aide? –

Répondre

0

Si vous utilisez parfaitement un fichier local avec deux fichiers locaux, vous ne pouvez pas lire deux fichiers audio à la fois.

Lorsque l'entrée provient d'un fichier local ou en continu, ffmpeg connaît exactement son heure de début. il peut donc être mélangé en un seul son. Si l'entrée provient de Live en streaming, ffmpeg ne sait pas exactement "quand il démarre" donc l'heure de début devrait être différente selon l'URL de streaming.

Plus important est que ffmpeg ne supporte pas la concurrence lors de la gestion des entrées. c'est pourquoi l'ordre de "bonjour" dépend de l'ordre des entrées.

Je connais juste une solution pour résoudre ce problème.Adobe FMLE (encodeur Flash Media Live) prenant en charge le code temporel lors de l'utilisation du streaming RTMP. Vous pouvez obtenir le code temporel à la fois en streaming en direct, puis vous pouvez enfin mélanger deux audio en un seul.

Peut-être, vous pouvez commencer par cet article: http://www.overdigital.com/2013/03/25/3ways-to-sync-data/

0

Essayez

ffmpeg -i rtsp://user:[email protected] -i rtsp://user:[email protected] \ 
-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