OXY NOTES

中華製の監視カメラが生成する謎のh264形式動画を一般のプレイヤーで再生する方法

我が家では「SV3C」という監視カメラを導入しています。アマゾンで安価に販売されている中華製の監視カメラです。

説明書の日本語がおかしかったり、必要な情報が見つけにくいなど、設置に難はあるものの性能は申し分ありません。
しかしこのカメラには設置の難しさだけでなく、もう一つ問題があります。
保存した動画を再生できるのは専用のプレーヤーだけという点です。唯一再生できるのはHIPlayerというプレーヤーです。これでは動画の共有が困難です。

解決策を調べていてわかったのですが、安価な中華製監視カメラではよくあることのようです。
では、なぜ謎の動画形式を採用するのか調べると、H.264のライセンス料が関係しているようです。中華メーカーが1円でも安く監視カメラを販売するためにとった苦肉の策です。
つまり、監視カメラのメーカーがわざと再生できない動画を作成しているというのが実情のようです。

ただし、謎の形式とは言ってもファイルのヘッダを操作しているだけで、実態はH.264形式です。ヘッダ情報を書き換えれば一般のプレーヤーで再生可能です。問題はその方法ですが、すでに海外では対策ソフトが公開されています。

Cheap Chinese camera garbled .264 files

ページ中程にある「convert.exe」という文字をクリックしてダウンロードしてください。

2020年5月追記

上記サイトで配布されていた「convert.exe」は配布が停止されています。
別の方より、より良いコードを提示されたため、そちらを掲載するというスタイルにされたようです。

そこで当サイトでは上記サイトで新しいプログラムが提供されるまでの暫定措置として改良されたコードのプログラムを配布します。


	convert_re.exe

使用方法や注意点などはReadMe.txtをご覧ください。

使い方は簡単で、このソフトに動画ファイルをドラッグすれば同じフォルダに一般のプレーヤーで再生できる形式のファイルを書き出してくれます。

例)
input.h264をドラッグするとinput.h264.mp4input.h264.wmvの二種類が出力される。

これで万事解決かと言われるとそうでもなく、私の環境ではなぜか倍速で再生される動画が書き出されます。

2020年5月追記

SV3Cシリーズの公式ページで専用のソフトが公開されました。
その使い方を解説しました。
「中華製の監視カメラ「SV3C」で撮影した動画をavi形式へ変換する方法

倍速になってしまった動画を通常の速度へ変更する方法

ここからは中華製の監視カメラとは関係なく、ただの動画エンコードの話です。お気に入りのエンコーダーがある場合はそちらを利用してください。
私の場合はコマンドラインで簡単にエンコードできるffmpegを利用しました。

ffmpegのダウンロードページでWindowsマークをクリックしてダウンロードします。

中のファイルbinフォルダcドライブ直下に移動。
スタートメニューの隣の検索に「環境変数を編集」と入力し実行。

新規」で、変数に「ffmpeg」で値に「c://bin\ffmpeg」と入力してOKをクリック。

スタートメニューの隣の検索に「cmd」でコマンドプロンプトを起動。変換したいファイルのフォルダへ移動。

例)デスクトップへ移動する

$ cd Desktop

続いてffmpegで再生速度を半分にするコマンドを実行。

例)変換するファイル名が「input.h264.mp4」の場合

ffmpeg -i input.h264.mp4 -vf setpts=PTS/0.5 -af atempo=0.5 output.mp4

フォルダに出力されたoutput.mp4が変換された動画ファイルです。
ffmpegのコマンドについて解説すると長くなるので、ざっくり解説します。
-i input.h264.mp4」の部分が変換するファイル名の指定。
-vf setpts=PTS/0.5」の部分が動画の再生スピードに関する部分。1が等倍で、2が倍速。今回は0.5なので半分の速度に変換という意味です。
-af atempo=0.5」の部分が音声。数字の意味は上と同じです。
そして最後に出力ファイルの名前を指定しています。

ffmpegについて更に詳しく知りたい方は公式ページのDocumentationをご覧ください。

以下テストで書き出した際のffmpegの出力(クリックすると展開します)

cd C:\HIDownload\2019_01_08\MMMM-380810-DCEBF

C:\HIDownload\2019_01_08\MMMM-380810-DCEBF>ffmpeg -i A20190106_203030_203044.mp4 -vf setpts=PTS/0.5 -af atempo=0.5 A20190106_203030_203044_output.mp4
ffmpeg version 2.8.4 Copyright (c) 2000-2015 the FFmpeg developers
  built with gcc 5.2.0 (GCC)
  configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-avisynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libdcadec --enable-libfreetype --enable-libgme --enable-libgsm --enable-libilbc --enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libschroedinger --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs --enable-libxvid --enable-lzma --enable-decklink --enable-zlib
  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
  libswscale      3.  1.101 /  3.  1.101
  libswresample   1.  2.101 /  1.  2.101
  libpostproc    53.  3.100 / 53.  3.100
Invalid UE golomb code
    Last message repeated 6 times
Input #0, h264, from 'A20190106_203030_203044.mp4':
  Duration: N/A, bitrate: N/A
    Stream #0:0: Video: h264 (Main), yuvj420p(pc, bt709), 1280x960, 25 fps, 25 tbr, 1200k tbn, 50 tbc
No pixel format specified, yuvj420p for H.264 encoding chosen.
Use -pix_fmt yuv420p for compatibility with outdated media players.
[libx264 @ 054fb600] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX FMA3 AVX2 LZCNT BMI2
[libx264 @ 054fb600] profile High, level 3.2
[libx264 @ 054fb600] 264 - core 148 r2638 7599210 - H.264/MPEG-4 AVC codec - Copyleft 2003-2015 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=6 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1 b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=25 scenecut=40 intra_refresh=0 rc_lookahead=40 rc=crf mbtree=1 crf=23.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00
Output #0, mp4, to 'A20190106_203030_203044_output.mp4':
  Metadata:
    encoder         : Lavf56.40.101
    Stream #0:0: Video: h264 (libx264) ([33][0][0][0] / 0x0021), yuvj420p(pc), 1280x960, q=-1--1, 25 fps, 12800 tbn, 25 tbc
    Metadata:
      encoder         : Lavc56.60.100 libx264
Stream mapping:
  Stream #0:0 -> #0:0 (h264 (native) -> h264 (libx264))
Press [q] to stop, [?] for help
Invalid UE golomb code
    Last message repeated 1 times
frame=   59 fps=0.0 q=28.0 size=     156kB time=00:00:00.28 bitrate=4571.3kbits/frame=   83 fps= 75 q=28.0 size=     477kB time=00:00:01.24 bitrate=3148.6kbits/Invalid UE golomb code
frame=  101 fps= 63 q=28.0 size=     739kB time=00:00:01.96 bitrate=3088.1kbits/frame=  133 fps= 62 q=28.0 size=     889kB time=00:00:03.24 bitrate=2246.5kbits/Invalid UE golomb code
frame=  165 fps= 62 q=28.0 size=    1140kB time=00:00:04.52 bitrate=2065.8kbits/Invalid UE golomb code
frame=  195 fps= 62 q=28.0 size=    1496kB time=00:00:05.72 bitrate=2142.8kbits/frame=  213 fps= 58 q=28.0 size=    1637kB time=00:00:06.44 bitrate=2082.9kbits/Invalid UE golomb code
frame=  245 fps= 56 q=28.0 size=    2016kB time=00:00:07.72 bitrate=2139.2kbits/Invalid UE golomb code
    Last message repeated 1 times
frame=  285 fps= 59 q=28.0 size=    2182kB time=00:00:09.32 bitrate=1918.3kbits/frame=  313 fps= 58 q=28.0 size=    2586kB time=00:00:10.44 bitrate=2029.1kbits/Invalid UE golomb code
    Last message repeated 1 times
frame=  337 fps= 56 q=28.0 size=    2863kB time=00:00:11.40 bitrate=2057.4kbits/frame=  355 fps= 55 q=28.0 size=    3189kB time=00:00:12.12 bitrate=2155.5kbits/Invalid UE golomb code
    Last message repeated 1 times
frame=  379 fps= 54 q=28.0 size=    3520kB time=00:00:13.08 bitrate=2204.3kbits/frame=  407 fps= 54 q=28.0 size=    3791kB time=00:00:14.20 bitrate=2187.0kbits/frame=  407 fps= 50 q=-1.0 Lsize=    4119kB time=00:00:16.20 bitrate=2083.1kbits/s dup=203 drop=0
video:4114kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.129582%
[libx264 @ 054fb600] frame I:2     Avg QP:18.94  size:165622
[libx264 @ 054fb600] frame P:149   Avg QP:21.63  size: 23618
[libx264 @ 054fb600] frame B:256   Avg QP:26.12  size:  1413
[libx264 @ 054fb600] consecutive B-frames: 14.7%  1.0%  9.6% 74.7%
[libx264 @ 054fb600] mb I  I16..4:  6.7% 31.0% 62.3%
[libx264 @ 054fb600] mb P  I16..4:  1.9%  6.2%  3.2%  P16..4: 36.4%  3.8%  2.8%  0.0%  0.0%    skip:45.8%
[libx264 @ 054fb600] mb B  I16..4:  0.0%  0.0%  0.0%  B16..8: 26.6%  0.6%  0.1%  direct: 0.4%  skip:72.2%  L0:63.4% L1:36.2% BI: 0.4%
[libx264 @ 054fb600] 8x8 transform intra:52.6% inter:25.1%
[libx264 @ 054fb600] coded y,uvDC,uvAC intra: 76.8% 60.8% 16.2% inter: 7.0% 9.4% 0.1%
[libx264 @ 054fb600] i16 v,h,dc,p: 14% 13% 19% 54%
[libx264 @ 054fb600] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 26% 21% 23%  5%  4%  5%  4%  6%  7%
[libx264 @ 054fb600] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 31% 17% 16%  5%  7%  8%  5%  5%  6%
[libx264 @ 054fb600] i8c dc,h,v,p: 29% 24% 26% 22%
[libx264 @ 054fb600] Weighted P-Frames: Y:3.4% UV:2.7%
[libx264 @ 054fb600] ref P L0: 79.1%  6.5% 10.4%  3.8%  0.2%
[libx264 @ 054fb600] ref B L0: 85.2% 14.5%  0.3%
[libx264 @ 054fb600] ref B L1: 96.0%  4.0%
[libx264 @ 054fb600] kb/s:2069.82

以上、中華製監視カメラの映像を一般のプレーヤーで再生できるようにする方法でした。
はっきり言って、PCの操作になれない方にとっては難しい操作だと思います。

多少の煩わしさを甘受して安さを取るか、手軽さのために3倍ほどの価格差を受け入れて日本製にするか…。難しいところです。