2017-05-12 102 views
1

在OSX我可以从我的摄像头记录和写的视频文件有以下简单的脚本:如何用H264编解码器编写mp4视频文件?

import cv2 
camera = cv2.VideoCapture(0) 

# Define the codec and create VideoWriter object to save the video 
fourcc = cv2.VideoWriter_fourcc(*'XVID') 
video_writer = cv2.VideoWriter('output.avi', fourcc, 25.0, (640, 480)) 

while True: 
    try: 
     (grabbed, frame) = camera.read() # grab the current frame 
     frame = cv2.resize(frame, (640, 480)) # resize the frame 
     video_writer.write(frame) # Write the video to the file system 

    except KeyboardInterrupt: 
     camera.release() 
     break 

生成的AVI文件是相当大的,但。我想要一个较小的文件,最好是mp4。所以我将文件名改为output.mp4,将4cc编解码器改为H264。写入视频文件,它的工作原理,但给了我以下错误:

$ python write_video_file.py 
OpenCV: FFMPEG: tag 0x34363248/'H264' is not supported with codec id 28 and format 'mp4/MP4 (MPEG-4 Part 14)' 
OpenCV: FFMPEG: fallback to use tag 0x00000021/'!???' 

因为我以为我失踪了H264编解码器的ffmpeg,我决定卸载的ffmpeg和OpenCV,并与H264支持重新安装它们。为此,我使用以下命令:

# First ffmpeg 
brew install ffmpeg --with-fdk-aac --with-libvidstab --with-openh264 \ 
     --with-openjpeg --with-openssl --with-tools --with-webp --with-x265 --with-zeromq 
# then opencv3 
brew tap homebrew/science 
brew install opencv3 --with-contrib --with-ffmpeg --with-tbb 

此我再次运行脚本,使用下列组合后:

  • output.mp4H264
  • output.mp4X264

不幸我仍然得到OpenCV警告/错误。该文件是可读的,但它仍然让我感到我得到这些错误。有谁知道我怎样才能让OpenCV用H264编解码器编写mp4视频文件?

欢迎所有提示!

+0

您尝试重新启动吗? –

+0

@StavrosAvramidis - 不,重新启动没有帮助 – kramer65

+0

确保你有ffdshow(x32和x64) –

回答

0

我花了年龄试图找到MACOS视频编解码器的列表,以及发现的编解码器与容器,然后如果的QuickTime实际上可以读取生成的文件工作。

我可以总结我的发现如下:

.mov container and fourcc('m','p','4','v') work and QuickTime can read it 
.mov container and fourcc('a','v','c','1') work and QuickTime can read it 
.avi container and fourcc('F','M','P','4') works but QuickTime cannot read it without conversion 

我曾经试图写在mp4容器h264视频,你想要的,只是没有使用的OpenCV的VideoWriter模块。相反,我改变了代码(我正好是C++)刚刚输出的原始bgr24格式的数据 - 这是OpenCV中如何喜欢存储像素反正:

所以存储在一个名为FrameMat视频帧的输出变为:

cout.write(reinterpret_cast<const char *>(Frame.data),width*height*3); 

,然后你管你的程序的输出为ffmpeg这样的:

./yourProgram | ffmpeg -y -f rawvideo -pixel_format bgr24 -video_size 1024x768 -i - -c:v h264 -pix_fmt yuv420p video.mp4 

是的,我知道我已经取得了一些假设:

  • 的数据CV8_UC3,
  • ,该尺寸在OpenCV的的ffmpeg匹配,并且
  • ,没有填充或疯狂阔步在OpenCV的数据,

但基本技术的原理,你能适应它的其它尺寸和情况。

相关问题