web-dev-qa-db-ja.com

libx264コーデックを使用してFFmpegでエンコードされたビデオは、モバイルデバイスで期待どおりに再生されません

私は現在、IPカメラのビデオを取得してWebサイトにストリーミングするプロジェクトに取り組んでいます。このカメラはビーチにあるため、ストリーミング信号をサーバーに送信し、サーバーからクライアントデバイスに送信するというアイデアがあります。

このために、私は担当のビーチでRaspberry Pi 3 B +を使用して、カメラからの信号を取得し、サーバーに送信しています。

FFmpegを使用してRTSP信号をHLSセグメントに変換し、それらをサーバーに保存してから、VideoJS7.4.1を使用してブラウザーでセグメントを再生しています。

これは私が使用しているFFmpegのコードです:

ffmpeg -i  rtsp://CameraIP/onvif1 -c:v libx264  -preset veryfast -crf 17 -an -hls_time 40 -hls_list_size 5 ftp://ServerIP/stream/abc.m3u8

これは非常にうまく機能しますが、問題は、RaspberryがこのタスクにCPU使用率の約70%を使用することです。そのため、品質を下げる必要があります。幸いなことに、カメラ信号はすでにh264形式になっています(h264と言います)。ネイティブ)なので、ビデオコーデックをlibx264に変換する代わりに、次のコマンドを使用してストリームをコピーしてみます。

ffmpeg -i  rtsp://cameraIP/onvif1 -c:v copy -an -hls_time 40 -hls_list_size 5 ftp://ServerIP/stream/abc.m3u8

このコマンドを使用すると、CPU使用率が2または3%に低下するため、品質を向上させることができます。さらに優れたカメラを入手することもできます。しかし、問題はそれがモバイルで機能していないことです(FireFix、ChromeおよびSafari、両方のオペレーティングシステム、AndroidおよびiOs)で試してください)、VideoJSは示していますこのエラー:

破損の問題が原因で、またはブラウザがサポートしていない機能をメディアが使用したため、メディアの再生が中止されました

すべてのブラウザは最新です。

これはビデオコーデックをコピーするログであり、エンコーダは使用されていません

ffmpeg version 3.2.12-1~deb9u1+rpt1 Copyright (c) 2000-2018 the FFmpeg developers built with gcc 6.3.0 (Raspbian 6.3.0-18+rpi1+deb9u1) 20170516
  configuration: --prefix=/usr --extra-version='1~deb9u1+rpt1' --toolchain=hardened --libdir=/usr/lib/arm-linux-gnueabihf --incdir=/usr/include/arm-linux-gnueabihf --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-omx-rpi --enable-mmal --enable-openal --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libiec61883 --Arch=armhf --enable-chromaprint --enable-frei0r --enable-libopencv --enable-libx264 --enable-shared
  libavutil      55. 34.101 / 55. 34.101
  libavcodec     57. 64.101 / 57. 64.101
  libavformat    57. 56.101 / 57. 56.101
  libavdevice    57.  1.100 / 57.  1.100
  libavfilter     6. 65.100 /  6. 65.100
  libavresample   3.  1.  0 /  3.  1.  0
  libswscale      4.  2.100 /  4.  2.100
  libswresample   2.  3.100 /  2.  3.100
  libpostproc    54.  1.100 / 54.  1.100
Guessed Channel Layout for Input Stream #0.1 : mono
Input #0, rtsp, from 'rtsp://CameraIP/onvif1':
  Metadata:
    title           : H.264 Video, RtspServer_0.0.0.2
  Duration: N/A, start: 0.000000, bitrate: N/A
    Stream #0:0: Video: h264 (High), yuvj420p(pc, bt709, progressive), 1280x960, 15 tbr, 90k tbn, 180k tbc
    Stream #0:1: Audio: pcm_alaw, 8000 Hz, mono, s16, 64 kb/s
[hls @ 0xc52be0] Opening 'ftp://ServerIP/stream/abc0.ts' for writing
Output #0, hls, to 'ftp://ServerIP/stream/abc.m3u8':
  Metadata:
    title           : H.264 Video, RtspServer_0.0.0.2
    encoder         : Lavf57.56.101
    Stream #0:0: Video: h264 (High), yuvj420p(pc, bt709, progressive), 1280x960, q=2-31, 15 tbr, 90k tbn, 90k tbc
Stream mapping:
  Stream #0:0 -> #0:0 (copy)
Press [q] to stop, [?] for help

これは、h264をlibx264に変換するためのFFmpegログです。

ffmpeg version 3.2.12-1~deb9u1+rpt1 Copyright (c) 2000-2018 the FFmpeg developers built with gcc 6.3.0 (Raspbian 6.3.0-18+rpi1+deb9u1) 20170516
  configuration: --prefix=/usr --extra-version='1~deb9u1+rpt1' --toolchain=hardened --libdir=/usr/lib/arm-linux-gnueabihf --incdir=/usr/include/arm-linux-gnueabihf --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-omx-rpi --enable-mmal --enable-openal --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libiec61883 --Arch=armhf --enable-chromaprint --enable-frei0r --enable-libopencv --enable-libx264 --enable-shared
  libavutil      55. 34.101 / 55. 34.101
  libavcodec     57. 64.101 / 57. 64.101
  libavformat    57. 56.101 / 57. 56.101
  libavdevice    57.  1.100 / 57.  1.100
  libavfilter     6. 65.100 /  6. 65.100
  libavresample   3.  1.  0 /  3.  1.  0
  libswscale      4.  2.100 /  4.  2.100
  libswresample   2.  3.100 /  2.  3.100
  libpostproc    54.  1.100 / 54.  1.100
Guessed Channel Layout for Input Stream #0.1 : mono
Input #0, rtsp, from 'rtsp://CameraIP/onvif1':
  Metadata:
    title           : H.264 Video, RtspServer_0.0.0.2
  Duration: N/A, start: 0.000000, bitrate: N/A
    Stream #0:0: Video: h264 (High), yuvj420p(pc, bt709, progressive), 1280x960, 15 tbr, 90k tbn, 180k tbc
    Stream #0:1: Audio: pcm_alaw, 8000 Hz, mono, s16, 64 kb/s
No pixel format specified, yuvj420p for H.264 encoding chosen.
Use -pix_fmt yuv420p for compatibility with outdated media players.
[libx264 @ 0x814a50] using cpu capabilities: ARMv6 NEON
[libx264 @ 0x814a50] profile High, level 3.2
[hls @ 0x6addd0] Opening 'ftp://ServerIP/stream/abc0.ts' for writing
Output #0, hls, to 'ftp://ServerIP/stream/abc.m3u8':
  Metadata:
    title           : H.264 Video, RtspServer_0.0.0.2
    encoder         : Lavf57.56.101
    Stream #0:0: Video: h264 (libx264), yuvj420p(pc), 1280x960, q=-1--1, 15 fps, 90k tbn, 15 tbc
    Metadata:
      encoder         : Lavc57.64.101 libx264
    Side data:
      cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: -1
Stream mapping:
  Stream #0:0 -> #0:0 (h264 (native) -> h264 (libx264))
Press [q] to stop, [?] for help

したがって、モバイルブラウザはh264ネイティブをサポートできないようです。libx264に変換する必要があるため、これを解決する他の方法があります。モバイルブラウザと互換性のある別のエンコーダである可能性がありますか?

2
Bruno F

"ピクセル形式が指定されていません。H.264エンコーディング用のyuvj420pが選択されています。古いメディアプレーヤーとの互換性のために-pix_fmtyuv420pを使用してください。"

コマンドに-pix_fmtyuv420pを追加して、再生の互換性に役立つかどうかを確認してください。

1
mwjb