Jundong
Jundong

Reputation: 261

opencv cannot read MP4 file from sony camcorder

The sony camcorder recorded video in MP4 format. I am reading the file by

import cv2
vid = cv2.VideoCapture('sample.MP4')

my OpenCV version is 2.4.8, as a Python module.

The codec of the 'sample.MP4' is H.264, Linear PCM.

ffprobe sample.MP4

returns:

> Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'C0004.mp4':   Metadata:
>     major_brand     : XAVC
>     minor_version   : 16785407
>     compatible_brands: XAVCmp42iso2
>     creation_time   : 2016-06-06 13:41:51   Duration: 00:00:15.02, start: 0.000000, bitrate: 50439 kb/s
>     Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709/bt709/iec61966-2-4), 1920x1080 [SAR 1:1 DAR 16:9],
> 48655 kb/s, 29.97 fps, 29.97 tbr, 30k tbn, 59.94 tbc (default)
>     Metadata:
>       creation_time   : 2016-06-06 13:41:51
>       handler_name    : Video Media Handler
>       encoder         : AVC Coding
>     Stream #0:1(und): Audio: pcm_s16be (twos / 0x736F7774), 48000 Hz, 2 channels, s16, 1536 kb/s (default)
>     Metadata:
>       creation_time   : 2016-06-06 13:41:51
>       handler_name    : Sound Media Handler
>     Stream #0:2(und): Data: none (rtmd / 0x646D7472), 245 kb/s (default)
>     Metadata:
>       creation_time   : 2016-06-06 13:41:51
>       handler_name    : Timed Metadata Media Handler 
> Unsupported codec with id 0 for input stream 2

It seems that the codec for h.264 is missing. The version of my FFmpeg is 3.0.

I tried avconv -i sample.MP4 -c:a copy -c:v copy sample_converted.mp4 to convert the sample.MP4 to sample_converted.mp4, this command line did not work. The command ffmpeg -i sample.mp4 sample_converted.mp4 worked; however, it compromised the video quality badly.I used an online video converter: http://www.online-convert.com/ (which output nice quality video in mp4 format, but it has size limitation for free users) to convert the MP4 to mp4, the command in Terminal as below:

ffprobe 'sample_converted.mp4'

returns

> Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'C0001_converted.mp4':  
> Metadata:
>     major_brand     : isom
>     minor_version   : 512
>     compatible_brands: isomiso2avc1mp41
>     encoder         : Lavf57.36.100   Duration: 00:00:02.02, start: 0.000000, bitrate: 16777 kb/s
>     Stream #0:0(und): Video: h264 (Constrained Baseline) (avc1 / 0x31637661), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], 16801 kb/s, 59.94
> fps, 59.94 tbr, 60k tbn, 119.88 tbc (default)
>     Metadata:
>       handler_name    : VideoHandler
>     Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 127 kb/s (default)
>     Metadata:
>       handler_name    : SoundHandler

Obviously, the encoders, handler_names etc. of the sample.MP4 and sample_converted.mp4 are different. Any idea using FFmpeg or OpenCV to convert this raw video from camcorder to the readable format without compromising the video quality?

Upvotes: 2

Views: 1145

Answers (1)

Jundong
Jundong

Reputation: 261

The commands:

avconv -i sample.MP4 -c:v copy sample_converted.mp4

and

ffmpeg -i sample.MP4 -c:v copy sample_converted.mp4

both work, by converting the MP4 video file from Sony camcorder, to a MP4 file readable for OpenCV for further analysis. The video quality is not compromised.

Upvotes: 2

Related Questions