Потоковая передача HTML5 video (.webm) на rtmp сервер (.flv)

363
16 июля 2017, 13:18

Здравствуйте. Встала задача записывать видео из браузера и передавать на rtmp сервер. В этой задаче используется промежуточное проксирование на node.js сервер, который с помощью программы ffmpeg производит транскодирование в flv формат, и затем отправляет на rtmp сервер.

В качестве основы был найден пример на гитхаб

До сервера передача осуществляется посредством soket.io.

socket.on('start',function(m){
        if(ffmpeg_process || feedStream){
            socket.emit('fatal','stream already started.');
            return;
        }
        if(!socket._rtmpDestination){
            socket.emit('fatal','no destination given.');
            return;
        }
        var ops=[
            '-vcodec', socket._vcodec,'-i','-',
            '-c:v', 'libx264', '-preset', 'veryfast', '-tune', 'zerolatency',
            '-an', //TODO: give up audio for now...
            //'-async', '1', 
            //'-filter_complex', 'aresample=44100', //necessary for trunked streaming?
            //'-strict', 'experimental', '-c:a', 'aac', '-b:a', '128k',
            '-bufsize', '1000',
            '-f', 'flv', socket._rtmpDestination
        ];
        ffmpeg_process=spawn('ffmpeg', ops);
        feedStream=function(data){
            ffmpeg_process.stdin.write(data);
            //write exception cannot be caught here.    
        }
        ffmpeg_process.stderr.on('data',function(d){
            socket.emit('ffmpeg_stderr',''+d);
        });
        ffmpeg_process.on('error',function(e){
            console.log('child process error'+e);
            socket.emit('fatal','ffmpeg error!'+e);
            feedStream=false;
            socket.disconnect();
        });
        ffmpeg_process.on('exit',function(e){
            console.log('child process exit'+e);
            socket.emit('fatal','ffmpeg exit!'+e);
            socket.disconnect();
        });
    });
    socket.on('binarystream',function(m){
        if(!feedStream){
            socket.emit('fatal','rtmp not set yet.');
            return;
        }
        feedStream(m);
    });

, но на этапе выполнения транскодирования вываливаются ошибки.

SERVER:Hello from mediarecorder-to-rtmp server!
SERVER:Please set rtmp destination before start streaming.
SERVER:rtmp destination set to:rtmp://media.artinvest52.ru:1935/live
FFMPEG:ffmpeg version 2.8.11-0ubuntu0.16.04.1 Copyright (c) 2000-2017 the FFmpeg developers
  built with gcc 5.4.0 (Ubuntu 5.4.0-6ubuntu1~16.04.4) 20160609
  configuration: --prefix=/usr --extra-version=0ubuntu0.16.04.1 --build-suffix=-ffmpeg --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --cc=cc --cxx=g++ --enable-gpl --enable-shared --disable-stripping --disable-decoder=libopenjpeg --disable-decoder=libschroedinger --enable-avresample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libmodplug --enable-libmp3lame --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-librtmp --enable-libschroedinger --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-libzvbi --enable-openal --enable-opengl --enable-x11grab --enable-libdc1394 --enable-libiec61883 --enable-libzmq --enable-frei0r --enable-libx264 --enable-libopencv
FFMPEG:  libavutil      54. 31.100 / 54. 31.100
  libavcodec     56. 60.100 / 56. 60.100
  libavformat    56. 40.101 / 56. 40.101
  libavdevice    56.  4.100 / 56.  4.100
  libavfilter     5. 40.101 /  5. 40.101
  libavresample   2.  1.  0 /  2.  1.  0
  libswscale      3.  1.101 /  3.  1.101
  libswresample   1.  2.101 /  1.  2.101
  libpostproc    53.  3.100 / 53.  3.100
FFMPEG:[libvpx @ 0x1b0e8e0] v1.5.0
FFMPEG:[libvpx @ 0x1b0e8e0] Failed to decode frame: Bitstream not supported by this decoder
FFMPEG:    Last message repeated 77 times
[matroska,webm @ 0x1b0c4a0] decoding for stream 1 failed
[matroska,webm @ 0x1b0c4a0] Could not find codec parameters for stream 1 (Video: vp8, none, 640x480): unspecified pixel format
Consider increasing the value for the 'analyzeduration' and 'probesize' options
FFMPEG:Input #0, matroska,webm, from 'pipe:':
  Metadata:
    encoder         : Chrome
  Duration: N/A, start: 0.000000, bitrate: N/A
    Stream #0:0(eng): Audio: opus, 48000 Hz, mono, fltp (default)
    Stream #0:1(eng): Video: vp8, none, 640x480, SAR 1:1 DAR 4:3, 16.67 tbr, 1k tbn, 1k tbc (default)
FFMPEG:[buffer @ 0x1b6d720] Unable to parse option value "-1" as pixel format
FFMPEG:    Last message repeated 1 times
[buffer @ 0x1b6d720] Error setting option pix_fmt to value -1.
[graph 0 input from stream 0:1 @ 0x1bbf860] Error applying options to the filter.
Error opening filters!
ERROR: unexpected:ffmpeg exit!1
ERROR: server disconnected!
READ ALSO
Может ли Google специально делать свои сервисы (например YouTube) тормознутыми не в их браузере (Chrome)? [требует правки]

Может ли Google специально делать свои сервисы (например YouTube) тормознутыми не в их браузере (Chrome)? [требует правки]

JS у них во всех сервисах обфусцирован, поэтому я даже не пытался разобратьсяТак же могут использоваться и какие либо сложные серверные технологии

273
Очистка карты от маршрута при нажатии кнопки

Очистка карты от маршрута при нажатии кнопки

Нужно построить автомобильный и пешеходный маршруты через google maps по двум точкамЕсть два поля ввода (от и до), и две кнопки (автомобильный маршрут...

274
Вывод ошибки javascript в Gulp

Вывод ошибки javascript в Gulp

Помогите решить проблему с выводом ошибки javascript в gulp при помощи плагинов, которые выводят ошибку в отдельном окне, как notyficationДля less настроил,...

483
Как убрать стрелочку у “Select” IE10+? [дубликат]

Как убрать стрелочку у “Select” IE10+? [дубликат]

На данный вопрос уже ответили:

385