FFServer потоковой передачи H.264 от Logitech C920 без перекодирования

Я пытаюсь транслировать нативную ленту веб-камеры .H264 с веб-камеры Logitech C920 в режиме реального времени с устройства Odroid (робота) через ffserver, работающий на отдельном сервере (CentOS 7.1), в браузер пользователей без повторной регистрации .H264 видео канал.

Наличие видеопотока в реальном времени в браузере само по себе является непростой задачей, поэтому сейчас я просто пытаюсь получить веб-камеру Logitech C920 на Odroid для потоковой передачи своего исходного видеопотока в реальном времени .H264 в виде mp4 через ffserver для пользователей. без необходимости перекодировать видео в процессе. Очевидно, что я хочу избежать перекодирования, так как это заняло бы слишком много процессорного времени и убило бы видео в реальном времени. Позже мне может понадобиться изменить контейнер на .flv или rtp, чтобы он мог воспроизводиться из браузера в режиме реального времени. Я использую веб-камеру Logitech C920, потому что она может выполнять кодирование .H264 на оборудовании. (он был протестирован путем непосредственного сохранения файла, он работает, за исключением общеизвестной проблемы с «рывками», связанной с ошибкой ядра Linux: http://sourceforge.net/p/linux-uvc/mailman/message/33164469/, но это другая история)

Проблема в том, что как бы я ни включил ffmpeg-ffserver, как только ffserver появится на картинке, канал будет перекодирован - даже с h264 (нативный) до h264 (libx264) - занимая 100% ЦП на Odroid устройство и внесение огромной задержки в видео-канал.

Ниже приведены мои настройки ffmpeg и ffserver.

Ffmpeg с устройства Odroid, передающего поток .H264 на ffserver

$ ffmpeg -s 1920x1080 -f v4l2 -vcodec h264 -i /dev/video0 -copyinkf -vcodec copy http://xxxyyyy.com:8090/feed1.ffm
ffmpeg version N-72744-g653bf3c Copyright (c) 2000-2015 the FFmpeg developers
  built with gcc 4.8 (Ubuntu/Linaro 4.8.2-19ubuntu1)
  configuration: --prefix=/home/odroid/ffmpeg_build --pkg-config-flags=--static --extra-cflags=-I/home/odroid/ffmpeg_build/include --extra-ldflags=-L/home/odroid/ffmpeg_build/lib --bindir=/home/odroid/bin --enable-gpl --enable-libass --enable-libfdk-aac --enable-libfreetype --enable-libmp3lame --enable-libopus --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265 --enable-nonfree
  libavutil      54. 27.100 / 54. 27.100
  libavcodec     56. 41.100 / 56. 41.100
  libavformat    56. 36.100 / 56. 36.100
  libavdevice    56.  4.100 / 56.  4.100
  libavfilter     5. 16.101 /  5. 16.101
  libswscale      3.  1.101 /  3.  1.101
  libswresample   1.  2.100 /  1.  2.100
  libpostproc    53.  3.100 / 53.  3.100
Input #0, video4linux2,v4l2, from '/dev/video0':
  Duration: N/A, start: 6581.606726, bitrate: N/A
    Stream #0:0: Video: h264 (Constrained Baseline), yuvj420p(pc), 1920x1080 [SAR 1:1 DAR 16:9], -5 kb/s, 30 fps, 30 tbr, 1000k tbn, 60 tbc
[swscaler @ 0x11bf0b0] deprecated pixel format used, make sure you did set range correctly
No pixel format specified, yuvj420p for H.264 encoding chosen.
Use -pix_fmt yuv420p for compatibility with outdated media players.
[libx264 @ 0x12590e0] using SAR=64/45
[libx264 @ 0x12590e0] using cpu capabilities: ARMv6 NEON
[libx264 @ 0x12590e0] profile High, level 1b
Output #0, ffm, to 'http://robo-car.int.thomsonreuters.com:8090/feed1.ffm':
  Metadata:
    creation_time   : now
    encoder         : Lavf56.36.100
    Stream #0:0: Video: h264 (libx264), yuvj420p(pc), 160x128 [SAR 64:45 DAR 16:9], q=-1--1, 64 kb/s, 30 fps, 1000k tbn, 5 tbc
    Metadata:
      encoder         : Lavc56.41.100 libx264
Stream mapping:
  Stream #0:0 -> #0:0 (h264 (native) -> h264 (libx264))
Press [q] to stop, [?] for help
^Cav_interleaved_write_frame(): Immediate exit requested00 bitrate=N/A dup=0 drop=97    
    Last message repeated 2140 times
frame= 3723 fps=301 q=-1.0 Lsize=     396kB time=00:12:14.20 bitrate=   4.4kbits/s dup=3699 drop=103    
video:321kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 23.500496%

И /etc/ffserver.conf на сервере, на котором работает ffserver:

HTTPPort 8090                      # Port to bind the server to
HTTPBindAddress 0.0.0.0
MaxHTTPConnections 2000
MaxClients 1000
MaxBandwidth 10000             # Maximum bandwidth per client
                               # set this high enough to exceed stream bitrate
CustomLog -

<Feed feed1.ffm>         # This is the input feed where FFmpeg will send
   File ./feed1.ffm            # video stream.
   FileMaxSize 1G              # Maximum file size for buffering video
</Feed>

<Stream test.mp4>
  Feed feed1.ffm
  Format mp4
  NoAudio
</Stream>

Как вы видели выше в разделе ffmpeg, на устройстве Odroid происходит повторное кодирование с максимальной загрузкой процессоров:

Stream mapping:
  Stream #0:0 -> #0:0 (h264 (native) -> h264 (libx264))

Я уже пытался установить значение VideoCodec в конфигурации ffserver непосредственно на libx264, пробовал параметр -re в ffmpeg, пробовал использовать другой синтаксис для ffmpeg и т. д. Ничего не помогает. Повторное соединение всегда есть, и поэтому я не могу сделать ffmpeg-ffserver просто для того, чтобы транслировать видеопоток как есть.

Оба ffmpeg (на Odroid и на сервере) были скомпилированы вчера (2015-06-09) из исходного кода, поэтому они являются последней (и той же) версией.

Есть идеи?

EDIT: Вкратце проблема заключается в следующем: я не могу найти способ заставить ffserver транслировать нативный канал h264, поступающий с веб-камеры Logitech C920, без перекодирования.

7 голосов | спросил Zoltan Fedor 10 J0000006Europe/Moscow 2015, 22:35:49

3 ответа


0

Ну, на самом деле это не ответ, но мне удалось сделать это, переключившись на vlc. К сожалению, мне не удалось заставить ffserver принимать входящий поток .H264 как есть, без перекодирования, и даже если бы я это сделал, у меня все еще была бы проблема регрессии ядра ffmpeg-C920-linux: http://sourceforge.net/p/linux-uvc/mailman/message/33164469/

Таким образом, было разумно отказаться от строки ffmpeg-ffserver и попробовать vlc.

В случае, если кому-то еще это интересно, с помощью vlc мне удалось добиться не перекодированного распространения нативного канала веб-камеры C920 .H264, выполнив следующее:

На устройстве Odroid это заберет поток .H264 с камеры и

streams it via http in mpeg-ts:
cvlc v4l2:///dev/video0:chroma=h264:width=1920:height=1080 --sout '#standard{access=http,mux=ts,dst=[ip of odroid]:8080,name=stream,mime=video/ts}' -vvv

На сервере CentOS 7 следующее получает поток от Odroid и передает его в многоадресном режиме, так что потребители могут подключиться к нему, вместо того, чтобы пытаться подключиться к устройству Odroid, которое имеет гораздо более ограниченную пропускную способность (wifi):

vlc http://[ip of odroid]:8080 --sout '#standard{access=http,mux=ts,dst=[ip of centos server]:8080,name=stream,mime=video/ts}' -vvv

Теперь я могу воспроизводить этот поток в режиме реального времени с проигрывателя VLC на устройстве:

http://[ip of centos server]:8080

Но да, на самом деле это не решение исходной проблемы ffmpeg-ffserver, а скорее обходной путь, использующий для этого vlc.

ответил Zoltan Fedor 12 J0000006Europe/Moscow 2015, 00:07:47
0

Еще одна вещь, которую я заметил в вашей конфигурации, это то, что вы транскодируете в высокий профиль в libx264 - "libx264 @ 0x12590e0] profile High, level 1b"

Попробуйте установить для профиля значение baseline or main, и это значительно снизит нагрузку на процессор. Высокий режим предназначен для кодирования таких вещей, как диски Blue-ray.

ответил Lyle 29 22016vEurope/Moscow11bEurope/MoscowTue, 29 Nov 2016 01:33:38 +0300 2016, 01:33:38
0

Можете ли вы удалить -vcodec h264, как вы видите, вы упоминаете два видеокодека -vcodec h264 и снова -vcodec copy. И еще одна вещь, ffserver не поддерживает потоковую передачу mp4. Попробуйте преобразовать его в webm или flv. См. Начните простой поток mp4 с помощью ffserver

ответил budthapa 11 J0000006Europe/Moscow 2015, 14:43:43

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132