[FFmpeg-trac] #9306(undetermined:new): Can't handle slightly broken MP4 from some Hikvision IP camera + workaround
FFmpeg
trac at avcodec.org
Mon Jun 28 00:38:09 EEST 2021
#9306: Can't handle slightly broken MP4 from some Hikvision IP camera + workaround
-------------------------------------+-------------------------------------
Reporter: marekm | Type: defect
Status: new | Priority: normal
Component: | Version:
undetermined | unspecified
Keywords: | Blocked By:
Blocking: | Reproduced by developer: 0
Analyzed by developer: 0 |
-------------------------------------+-------------------------------------
Reported in VLC as well:
https://code.videolan.org/videolan/vlc/-/issues/25864
Files downloaded from the NVR that were recorded from the Hikvision DS-
2DE7184-AE (PTZ IP camera) are slightly broken in that VLC (latest as well
as 3 years old tested) doesn't play them correctly, just shows still
picture the whole time (the same file works fine in Hikvision VSPlayer and
Linux mplayer). I have a few other IP cameras recorded by the same NVR
but files from them don't show the same issue. ffmpeg can't copy such
files even without any conversion, see the log below. The workaround is
to repair the file using this command (just remove the audio, which I
don't care about anyway - the camera has no microphone connected):
ffmpeg -i input.mp4 -c:v copy -an output.mp4
Yes, removing the audio allows video to play in VLC correctly!
Hopefully this will give a hint where the bug could be.
(well, it's in that Hikvision camera, but can't fix that - so "be liberal
in what you accept")
I can provide sample files, but they are big (~1 GB).
The above command works fine, the below one doesn't, see the log:
ffmpeg -i input.mp4 -c copy output.mp4
ffmpeg started on 2021-06-27 at 22:54:25
Report written to "ffmpeg-20210627-225425.log"
Log level: 48
Command line:
"..\\..\\ffmpeg.exe" -report -i 00000000152000000.mp4 -c copy b.mp4
ffmpeg version 2021-06-27-git-49e3a8165c-full_build-www.gyan.dev Copyright
(c) 2000-2021 the FFmpeg developers
built with gcc 10.3.0 (Rev2, Built by MSYS2 project)
configuration: --enable-gpl --enable-version3 --enable-static --disable-
w32threads --disable-autodetect --enable-fontconfig --enable-iconv
--enable-gnutls --enable-libxml2 --enable-gmp --enable-lzma --enable-
libsnappy --enable-zlib --enable-librist --enable-libsrt --enable-libssh
--enable-libzmq --enable-avisynth --enable-libbluray --enable-libcaca
--enable-sdl2 --enable-libdav1d --enable-libzvbi --enable-librav1e
--enable-libsvtav1 --enable-libx264 --enable-libx265 --enable-libxvid
--enable-libaom --enable-libopenjpeg --enable-libvpx --enable-libass
--enable-frei0r --enable-libfreetype --enable-libfribidi --enable-
libvidstab --enable-libvmaf --enable-libzimg --enable-amf --enable-cuda-
llvm --enable-cuvid --enable-ffnvcodec --enable-nvdec --enable-nvenc
--enable-d3d11va --enable-dxva2 --enable-libmfx --enable-libglslang
--enable-vulkan --enable-opencl --enable-libcdio --enable-libgme --enable-
libmodplug --enable-libopenmpt --enable-libopencore-amrwb --enable-
libmp3lame --enable-libshine --enable-libtheora libavutil 57.
0.100 / 57. 0.100
libavcodec 59. 2.100 / 59. 2.100
libavformat 59. 3.101 / 59. 3.101
libavdevice 59. 0.100 / 59. 0.100
libavfilter 8. 0.103 / 8. 0.103
libswscale 6. 0.100 / 6. 0.100
libswresample 4. 0.100 / 4. 0.100
libpostproc 56. 0.100 / 56. 0.100
Splitting the commandline.
Reading option '-report' ... matched as option 'report' (generate a
report) with argument '1'.
Reading option '-i' ... matched as input url with argument
'00000000152000000.mp4'.
Reading option '-c' ... matched as option 'c' (codec name) with argument
'copy'.
Reading option 'b.mp4' ... matched as output url.
Finished splitting the commandline.
Parsing a group of options: global .
Applying option report (generate a report) with argument 1.
Successfully parsed a group of options.
Parsing a group of options: input url 00000000152000000.mp4.
Successfully parsed a group of options.
Opening an input file: 00000000152000000.mp4.
[NULL @ 00000000005b2940] Opening '00000000152000000.mp4' for reading
[file @ 00000000005c8340] Setting default whitelist 'file,crypto,data'
[mpeg @ 00000000005b2940] Format mpeg probed with size=1048576 and
score=52
[mpeg @ 00000000005b2940] Before avformat_find_stream_info() pos: 6 bytes
read:1048576 seeks:0 nb_streams:0
[mpeg @ 00000000005b2940] parser not found for codec pcm_mulaw, packets or
times may be invalid.
[extract_extradata @ 00000000005cd700] nal_unit_type: 7(SPS), nal_ref_idc:
3
[extract_extradata @ 00000000005cd700] nal_unit_type: 8(PPS), nal_ref_idc:
3
[extract_extradata @ 00000000005cd700] nal_unit_type: 5(IDR), nal_ref_idc:
3
[h264 @ 00000000005c8980] nal_unit_type: 7(SPS), nal_ref_idc: 3
[h264 @ 00000000005c8980] nal_unit_type: 8(PPS), nal_ref_idc: 3
[h264 @ 00000000005c8980] nal_unit_type: 7(SPS), nal_ref_idc: 3
[h264 @ 00000000005c8980] nal_unit_type: 8(PPS), nal_ref_idc: 3
[h264 @ 00000000005c8980] nal_unit_type: 5(IDR), nal_ref_idc: 3
[h264 @ 00000000005c8980] Format yuv420p chosen by get_format().
[h264 @ 00000000005c8980] Reinit context to 1920x1088, pix_fmt: yuv420p
[h264 @ 00000000005c8980] nal_unit_type: 1(Coded slice of a non-IDR
picture), nal_ref_idc: 3
[h264 @ 00000000005c8980] nal_unit_type: 1(Coded slice of a non-IDR
picture), nal_ref_idc: 3
[h264 @ 00000000005c8980] nal_unit_type: 1(Coded slice of a non-IDR
picture), nal_ref_idc: 3
[h264 @ 00000000005c8980] nal_unit_type: 1(Coded slice of a non-IDR
picture), nal_ref_idc: 3
[h264 @ 00000000005c8980] nal_unit_type: 1(Coded slice of a non-IDR
picture), nal_ref_idc: 3
[h264 @ 00000000005c8980] nal_unit_type: 1(Coded slice of a non-IDR
picture), nal_ref_idc: 3
[mpeg @ 00000000005b2940] Probe buffer size limit of 5000000 bytes reached
[mpeg @ 00000000005b2940] rfps: 10.000000 0.009976
[mpeg @ 00000000005b2940] rfps: 15.000000 0.010102
[mpeg @ 00000000005b2940] rfps: 24.916667 0.011671
[mpeg @ 00000000005b2940] rfps: 25.000000 0.000110
[mpeg @ 00000000005b2940] rfps: 25.000000 0.000110
[mpeg @ 00000000005b2940] rfps: 25.083333 0.015204
[mpeg @ 00000000005b2940] rfps: 35.000000 0.010071
[mpeg @ 00000000005b2940] rfps: 40.000000 0.010449
[mpeg @ 00000000005b2940] rfps: 50.000000 0.000442
[mpeg @ 00000000005b2940] rfps: 50.000000 0.000442
[mpeg @ 00000000005b2940] rfps: 60.000000 0.010386
[mpeg @ 00000000005b2940] rfps: 59.940060 0.014711
[mpeg @ 00000000005b2940] rfps: 14.985015 0.010223
[mpeg @ 00000000005b2940] rfps: 14.985015 0.010223
[mpeg @ 00000000005b2940] After avformat_find_stream_info() pos: 6 bytes
read:5344420 seeks:2 frames:172
Input #0, mpeg, from '00000000152000000.mp4':
Duration: 00:17:45.10, start: 3597.910689, bitrate: 8002 kb/s
Stream #0:0[0x1e0], 49, 1/90000: Video: h264 (Main), yuv420p(tv, bt709,
progressive), 1920x1080, 10 fps, 25 tbr, 90k tbn
Stream #0:1[0x1c0], 123, 1/90000: Audio: pcm_mulaw, 8000 Hz, mono, s16,
64 kb/s
Successfully opened the file.
Parsing a group of options: output url b.mp4.
Applying option c (codec name) with argument copy.
Successfully parsed a group of options.
Opening an output file: b.mp4.
[file @ 0000000003527d40] Setting default whitelist 'file,crypto,data'
Successfully opened the file.
[mp4 @ 0000000002d69c00] Could not find tag for codec pcm_mulaw in stream
#1, codec not currently supported in container
Could not write header for output file #0 (incorrect codec parameters ?):
Invalid argument
Error initializing output stream 0:1 --
Stream mapping:
Stream #0:0 -> #0:0 (copy)
Stream #0:1 -> #0:1 (copy)
[AVIOContext @ 0000000003527e00] Statistics: 0 seeks, 0 writeouts
[AVIOContext @ 00000000005d05c0] Statistics: 5344420 bytes read, 2 seeks
--
Ticket URL: <https://trac.ffmpeg.org/ticket/9306>
FFmpeg <https://ffmpeg.org>
FFmpeg issue tracker
More information about the FFmpeg-trac
mailing list