Forum: PC-Programmierung ffmpeg, v4l, snd_aloop … sound asyncron (alsa buffer xrun)
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.
|