Forum: PC-Programmierung ffmpeg, v4l, snd_aloop … sound asyncron (alsa buffer xrun)


von Mark S. (mark_sedl)


Lesenswert?

Ich versuche, einen Stream zu erstellen, der zufällige Eingaben 
automatisch neu lädt. Ich möchte dies später auf eine Datenbank 
erweitern.

Jedes Mal, wenn ffmpeg beendet und neu gestartet wird, ändert sich die 
Eingabe. Die Verbindung zum RTMP wird kurz unterbrochen, wodurch die 
gesamte Verbindung unterbrochen wird. Ich habe dann versucht, Audio und 
Video zu trennen, an virtuelle Geräte zu senden und von dort erneut zu 
lesen. Teilen Sie den Stream auf virtuellen Geräten auf, bauen Sie sie 
direkt zusammen und senden Sie sie an rtmp. Wenn der Eingang dann 
ausgetauscht wird, unterbricht das Senden an die Geräte, was den zweiten 
ffmpeg nicht stört. Sobald ich aufhöre, an die Geräte zu senden, gehen 
die FPS sehr langsam (10 bis 20 Sekunden) von 25 auf 0. Erst dann bricht 
der Sender ffmpeg die Verbindung zum RTMP. Das Skript, das die Eingaben 
austauscht, benötigt nur eine Sekunde. Ein Praxistest zeigte, dass alles 
wie gewünscht funktioniert.

Ich kann die Eingabe ganz bequem ändern, während der zweite ffmpeg den 
Stream aufrechterhält ...

Die Freude dauerte nicht lange. Der Sound ist gut 1 Sek. Verzögert. Aber 
sporadisch. Manchmal klappt alles super. Manchmal ist der Klang 
versetzt.

Ich habe dazu mehrere Skripte geschrieben.

Hintergrund:

    Die Datei wird zufällig ausgewählt
    Mediendatei wird aufgeteilt und in  dev  video0 (v4l loopback) und 
alsa default (snd_aloop loopback) geschrieben.
    Setzen Sie die Splits wieder zusammen und streamen Sie sie auf einen 
RTMP-Server

Code, der die Eingabe auswählt und an  dev  video0 und als 
Standardwert sendet
1
#!/bin/bash
2
3
cat /dev/null > log
4
5
while true;
6
do
7
8
  WATERMARK="watermark.png";
9
  dir='/homeXXXXXXXXXX/mix'
10
  file=`/bin/ls -1 "$dir" | sort --random-sort | head -1`
11
  DATEI=`readlink --canonicalize "$dir/$file"` # Converts to full path
12
13
if [ -z $DATEI ]
14
then
15
  echo "Keine Datei gefunden" >> log;
16
else
17
  START=$(date +%s);
18
  echo "Sende $DATEI" >> log;
19
  ffmpeg -re -y -i "$DATEI" -c:v libx264 -vf "fps=25,scale=640:480,setdar=4:3" -async 1 -pix_fmt yuv420p -preset ultrafast -map 0:0 -f v4l2 -vcodec rawvideo /dev/video0 -f alsa default
20
fi
21
22
DOKILL=`cat kill`;
23
if [ "$DOKILL" = "1"]
24
then
25
  break;
26
fi
27
28
done

Output
1
./run.sh 
2
ffmpeg version 3.2.12-1~deb9u1 Copyright (c) 2000-2018 the FFmpeg developers
3
  built with gcc 6.3.0 (Debian 6.3.0-18+deb9u1) 20170516
4
  configuration: --prefix=/usr --extra-version='1~deb9u1' --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --enable-gpl --disable-stripping --enable-avresample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libebur128 --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libmp3lame --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-omx --enable-openal --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libopencv --enable-libx264 --enable-shared
5
  libavutil      55. 34.101 / 55. 34.101
6
  libavcodec     57. 64.101 / 57. 64.101
7
  libavformat    57. 56.101 / 57. 56.101
8
  libavdevice    57.  1.100 / 57.  1.100
9
  libavfilter     6. 65.100 /  6. 65.100
10
  libavresample   3.  1.  0 /  3.  1.  0
11
  libswscale      4.  2.100 /  4.  2.100
12
  libswresample   2.  3.100 /  2.  3.100
13
  libpostproc    54.  1.100 / 54.  1.100
14
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/home/mix/XXXXXXXXXXXXX.mp4':
15
  Metadata:
16
    major_brand     : isom
17
    minor_version   : 512
18
    compatible_brands: isomiso2avc1mp41
19
    title           : XXXXXXXXXXXXXXX 
20
21
    encoder         : Lavf57.41.100
22
  Duration: 00:03:53.48, start: 0.000000, bitrate: 2705 kb/s
23
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709), 1920x1080 [SAR 1:1 DAR 16:9], 2573 kb/s, 23.98 fps, 23.98 tbr, 24k tbn, 47.95 tbc (default)
24
    Metadata:
25
      handler_name    : VideoHandler
26
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 127 kb/s (default)
27
    Metadata:
28
      handler_name    : SoundHandler
29
Codec AVOption preset (Configuration preset) specified for output file #0 (/dev/video0) has not been used for any stream. The most likely reason is either wrong type (e.g. a video option with no video streams) or that it is a private option of some encoder which was not actually used for any stream.
30
[Parsed_setdar_2 @ 0x5571234fe020] num:den syntax is deprecated, please use num/den or named options instead
31
-async is forwarded to lavfi similarly to -af aresample=async=1:min_hard_comp=0.100000:first_pts=0.
32
Output #0, v4l2, to '/dev/video0':
33
  Metadata:
34
    major_brand     : isom
35
    minor_version   : 512
36
    compatible_brands: isomiso2avc1mp41
37
    title           : XXXXXXXXXXX 
38
39
    encoder         : Lavf57.56.101
40
    Stream #0:0(und): Video: rawvideo (I420 / 0x30323449), yuv420p, 640x480 [SAR 1:1 DAR 4:3], q=2-31, 200 kb/s, 25 fps, 25 tbn, 25 tbc (default)
41
    Metadata:
42
      handler_name    : VideoHandler
43
      encoder         : Lavc57.64.101 rawvideo
44
Output #1, alsa, to 'default':
45
  Metadata:
46
    major_brand     : isom
47
    minor_version   : 512
48
    compatible_brands: isomiso2avc1mp41
49
    title           : XXXXXXXXXX 
50
51
    encoder         : Lavf57.56.101
52
    Stream #1:0(und): Audio: pcm_s16le, 44100 Hz, stereo, s16, 1411 kb/s (default)
53
    Metadata:
54
      handler_name    : SoundHandler
55
      encoder         : Lavc57.64.101 pcm_s16le
56
Stream mapping:
57
  Stream #0:0 -> #0:0 (h264 (native) -> rawvideo (native))
58
  Stream #0:1 -> #1:0 (aac (native) -> pcm_s16le (native))
59
Press [q] to stop, [?] for help
60
frame=  736 fps= 24 q=-0.0 Lsize=N/A time=00:00:29.67 bitrate=N/A speed=0.979x    
61
video:331200kB audio:5112kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown
62
Exiting normally, received signal 2.

The send script
1
#!/bin/bash
2
3
IP="XXXXXXXXX";
4
5
ffmpeg -f video4linux2 -i /dev/video0 -f alsa -acodec pcm_s16le -i default -f flv -async 1 -pix_fmt yuv420p -preset ultrafast -vcodec libx264 -r 25 -s 640x260 -acodec aac rtmp://$IP:1935/live/test

The Output
1
./send_stream.sh 
2
ffmpeg version 3.2.12-1~deb9u1 Copyright (c) 2000-2018 the FFmpeg developers
3
  built with gcc 6.3.0 (Debian 6.3.0-18+deb9u1) 20170516
4
  configuration: --prefix=/usr --extra-version='1~deb9u1' --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --enable-gpl --disable-stripping --enable-avresample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libebur128 --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libmp3lame --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-omx --enable-openal --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libopencv --enable-libx264 --enable-shared
5
  libavutil      55. 34.101 / 55. 34.101
6
  libavcodec     57. 64.101 / 57. 64.101
7
  libavformat    57. 56.101 / 57. 56.101
8
  libavdevice    57.  1.100 / 57.  1.100
9
  libavfilter     6. 65.100 /  6. 65.100
10
  libavresample   3.  1.  0 /  3.  1.  0
11
  libswscale      4.  2.100 /  4.  2.100
12
  libswresample   2.  3.100 /  2.  3.100
13
  libpostproc    54.  1.100 / 54.  1.100
14
Input #0, video4linux2,v4l2, from '/dev/video0':
15
  Duration: N/A, start: 1548393682.674066, bitrate: 110592 kb/s
16
    Stream #0:0: Video: rawvideo (I420 / 0x30323449), yuv420p, 640x480, 110592 kb/s, 30 fps, 30 tbr, 1000k tbn, 1000k tbc
17
Guessed Channel Layout for Input Stream #1.0 : stereo
18
Input #1, alsa, from 'default':
19
  Duration: N/A, start: 1548393682.677901, bitrate: 1536 kb/s
20
    Stream #1:0: Audio: pcm_s16le, 48000 Hz, stereo, s16, 1536 kb/s
21
-async is forwarded to lavfi similarly to -af aresample=async=1:min_hard_comp=0.100000:first_pts=0.
22
[libx264 @ 0x55e22cfa4f00] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX
23
[libx264 @ 0x55e22cfa4f00] profile Constrained Baseline, level 2.1
24
[libx264 @ 0x55e22cfa4f00] 264 - core 148 r2748 97eaef2 - H.264/MPEG-4 AVC codec - Copyleft 2003-2016 - http://www.videolan.org/x264.html - options: cabac=0 ref=1 deblock=0:0:0 analyse=0:0 me=dia subme=0 psy=1 psy_rd=1.00:0.00 mixed_ref=0 me_range=16 chroma_me=1 trellis=0 8x8dct=0 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=0 threads=6 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=0 weightp=0 keyint=250 keyint_min=25 scenecut=0 intra_refresh=0 rc=crf mbtree=0 crf=23.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=0
25
Output #0, flv, to 'rtmp://XXXXXXXXXXX:1935/live/test':
26
  Metadata:
27
    encoder         : Lavf57.56.101
28
    Stream #0:0: Video: h264 (libx264) ([7][0][0][0] / 0x0007), yuv420p, 640x260, q=-1--1, 25 fps, 1k tbn, 25 tbc
29
    Metadata:
30
      encoder         : Lavc57.64.101 libx264
31
    Side data:
32
      cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: -1
33
    Stream #0:1: Audio: aac (LC) ([10][0][0][0] / 0x000A), 48000 Hz, stereo, fltp, 128 kb/s
34
    Metadata:
35
      encoder         : Lavc57.64.101 aac
36
Stream mapping:
37
  Stream #0:0 -> #0:0 (rawvideo (native) -> h264 (libx264))
38
  Stream #1:0 -> #0:1 (pcm_s16le (native) -> aac (native))
39
Press [q] to stop, [?] for help
40
[alsa @ 0x55e22cf87300] Thread message queue blocking; consider raising the thread_queue_size option (current value: 8)
41
[video4linux2,v4l2 @ 0x55e22cf84fe0] Thread message queue blocking; consider raising the thread_queue_size option (current value: 8)
42
Past duration 0.613319 too large    7344kB time=00:01:05.85 bitrate= 913.5kbits/s speed=1.04x    
43
Past duration 0.614372 too large    7644kB time=00:01:08.39 bitrate= 915.6kbits/s speed=1.04x    
44
Past duration 0.609749 too large    7834kB time=00:01:10.91 bitrate= 905.0kbits/s speed=1.04x    
45
Past duration 0.604362 too large    8038kB time=00:01:12.92 bitrate= 903.0kbits/s speed=1.04x    
46
Past duration 0.609489 too large    8070kB time=00:01:13.45 bitrate= 900.1kbits/s speed=1.04x    
47
Past duration 0.615013 too large    8094kB time=00:01:13.94 bitrate= 896.8kbits/s speed=1.04x    
48
Past duration 0.610893 too large    8179kB time=00:01:14.94 bitrate= 894.0kbits/s speed=1.04x    
49
Past duration 0.664711 too large
50
Past duration 0.639565 too large    8263kB time=00:01:15.47 bitrate= 896.8kbits/s speed=1.04x    
51
Past duration 0.668999 too large    8339kB time=00:01:15.94 bitrate= 899.5kbits/s speed=1.04x    
52
Past duration 0.605766 too large
53
Past duration 0.633049 too large    8399kB time=00:01:16.48 bitrate= 899.6kbits/s speed=1.04x    
54
Past duration 0.674599 too large
55
Past duration 0.616035 too large    8451kB time=00:01:16.95 bitrate= 899.7kbits/s speed=1.04x    
56
Past duration 0.656136 too large
57
Past duration 0.604195 too large
58
Past duration 0.601387 too large    8512kB time=00:01:17.46 bitrate= 900.2kbits/s speed=1.04x    
59
Past duration 0.621895 too large    8565kB time=00:01:17.95 bitrate= 900.1kbits/s speed=1.04x    
60
Past duration 0.670937 too large    8605kB time=00:01:18.46 bitrate= 898.4kbits/s speed=1.04x    
61
Past duration 0.604500 too large    8642kB time=00:01:18.99 bitrate= 896.2kbits/s speed=1.04x    
62
frame= 1913 fps= 25 q=-1.0 Lsize=    8670kB time=00:01:19.48 bitrate= 893.6kbits/s speed=1.04x    
63
video:7290kB audio:1280kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 1.160292%
64
[libx264 @ 0x55e22cfa4f00] frame I:8     Avg QP:18.25  size: 15502
65
[libx264 @ 0x55e22cfa4f00] frame P:1905  Avg QP:20.95  size:  3853
66
[libx264 @ 0x55e22cfa4f00] mb I  I16..4: 100.0%  0.0%  0.0%
67
[libx264 @ 0x55e22cfa4f00] mb P  I16..4:  6.4%  0.0%  0.0%  P16..4: 38.1%  0.0%  0.0%  0.0%  0.0%    skip:55.5%
68
[libx264 @ 0x55e22cfa4f00] coded y,uvDC,uvAC intra: 46.0% 30.3% 13.4% inter: 20.1% 9.8% 1.1%
69
[libx264 @ 0x55e22cfa4f00] i16 v,h,dc,p: 47% 34% 10%  9%
70
[libx264 @ 0x55e22cfa4f00] i8c dc,h,v,p: 45% 28% 22%  5%
71
[libx264 @ 0x55e22cfa4f00] kb/s:750.98
72
[aac @ 0x55e22cfa62a0] Qavg: 579.067
73
Exiting normally, received signal 2.

Erst ist alles gut und dann kommt
1
Past duration 0.616035 too large    8451kB time=00:01:16.95 bitrate= 899.7kbits/s speed=1.04x    
2
Past duration 0.656136 too large
3
Past duration 0.604195 too large
4
Past duration 0.601387 too large    8512kB time=00:01:17.46 bitrate= 900.2kbits/s speed=1.04x

Und dann, wenn das kommt, taucht man im ersten Fenster auf, also im 
ffmpeg die Eingabe:
1
Stream mapping:
2
  Stream #0:0 -> #0:0 (h264 (native) -> rawvideo (native))
3
  Stream #0:1 -> #1:0 (aac (native) -> pcm_s16le (native))
4
Press [q] to stop, [?] for help
5
frame=    9 fps=0.0 q=-0.0 size=N/A time=00:00:00.36 bitrate=N/A dup=1 drop=0 spframe=   21 fps= 21 q=-0.0 size=N/A time=00:00:00.84 bitrate=N/A dup=1 drop=0 sp[alsa @ 0x5643b3293160] ALSA buffer xrun.
6
    Last message repeated 1 times
7
frame=   33 fps= 22 q=-0.0 size=N/A time=00:00:01.32 bitrate=N/A dup=1 drop=0 sp[alsa @ 0x5643b3293160] ALSA buffer xrun.
8
    Last message repeated 1 times
9
frame=   46 fps= 23 q=-0.0 size=N/A time=00:00:01.84 bitrate=N/A dup=1 drop=0 spframe=   58 fps= 23 q=-0.0 size=N/A time=00:00:02.32 bitrate=N/A dup=1 drop=0 spframe=   71 fps= 24 q=-0.0 size=N/A time=00:00:02.84 bitrate=N/A dup=1 drop=0 spframe=   83 fps= 24 q=-0.0 size=N/A time=00:00:03.32 bitrate=N/A dup=1 drop=0 sp[alsa @ 0x5643b3293160] ALSA buffer xrun.
10
frame=   96 fps= 24 q=-0.0 size=N/A time=00:00:03.84 bitrate=N/A dup=1 drop=0 sp[alsa @ 0x5643b3293160] ALSA buffer xrun.

Der Sound ist dann absolut unsynchronisiert ...

Hat jemand einen Rat und kann mir helfen?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.