From 927cf4cfdcbe36119267fc0711e174249da857a3 Mon Sep 17 00:00:00 2001 From: deadprogram Date: Sun, 8 Oct 2017 12:58:25 +0200 Subject: [PATCH] Ability to select the desired VideoWriter output codec on Open() Signed-off-by: deadprogram --- cmd/savevideo/main.go | 2 +- videoio.cpp | 5 +++-- videoio.go | 14 ++++++++++++-- videoio.h | 2 +- videoio_test.go | 2 +- 5 files changed, 18 insertions(+), 7 deletions(-) diff --git a/cmd/savevideo/main.go b/cmd/savevideo/main.go index 2ccfe9f9..f08caaa6 100644 --- a/cmd/savevideo/main.go +++ b/cmd/savevideo/main.go @@ -45,7 +45,7 @@ func main() { return } - writer, err := gocv.VideoWriterFile(saveFile, 25, img.Cols(), img.Rows()) + writer, err := gocv.VideoWriterFile(saveFile, "MJPG", 25, img.Cols(), img.Rows()) if err != nil { fmt.Printf("error opening video writer device: %v\n", saveFile) return diff --git a/videoio.cpp b/videoio.cpp index ebfad579..f1b1b8a6 100644 --- a/videoio.cpp +++ b/videoio.cpp @@ -44,9 +44,10 @@ void VideoWriter_Close(VideoWriter vw) { delete vw; } -void VideoWriter_Open(VideoWriter vw, const char* name, double fps, int width, +void VideoWriter_Open(VideoWriter vw, const char* name, const char* codec, double fps, int width, int height) { - vw->open(name, CV_FOURCC('M', 'J', 'P', 'G'), fps, cv::Size(width, height), true); + int codecCode = cv::VideoWriter::fourcc(codec[0], codec[1], codec[2], codec[3]); + vw->open(name, codecCode, fps, cv::Size(width, height), true); } int VideoWriter_IsOpened(VideoWriter vw) { diff --git a/videoio.go b/videoio.go index ba3ab783..2bca171f 100644 --- a/videoio.go +++ b/videoio.go @@ -219,7 +219,13 @@ type VideoWriter struct { } // VideoWriterFile opens a VideoWriter with a specific output file. -func VideoWriterFile(name string, fps float64, width int, height int) (vw *VideoWriter, err error) { +// The "codec" param should be the four-letter code for the desired output +// codec, for example "MJPG". +// +// For further details, please see: +// http://docs.opencv.org/3.3.0/dd/d9e/classcv_1_1VideoWriter.html#a0901c353cd5ea05bba455317dab81130 +// +func VideoWriterFile(name string, codec string, fps float64, width int, height int) (vw *VideoWriter, err error) { vw = &VideoWriter{ p: C.VideoWriter_New(), mu: &sync.RWMutex{}, @@ -227,7 +233,11 @@ func VideoWriterFile(name string, fps float64, width int, height int) (vw *Video cName := C.CString(name) defer C.free(unsafe.Pointer(cName)) - C.VideoWriter_Open(vw.p, cName, C.double(fps), C.int(width), C.int(height)) + + cCodec := C.CString(codec) + defer C.free(unsafe.Pointer(cCodec)) + + C.VideoWriter_Open(vw.p, cName, cCodec, C.double(fps), C.int(width), C.int(height)) return } diff --git a/videoio.h b/videoio.h index 72e61dd0..8b5cd9f0 100644 --- a/videoio.h +++ b/videoio.h @@ -29,7 +29,7 @@ void VideoCapture_Grab(VideoCapture v, int skip); // VideoWriter VideoWriter VideoWriter_New(); void VideoWriter_Close(VideoWriter vw); -void VideoWriter_Open(VideoWriter vw, const char* name, double fps, int width, +void VideoWriter_Open(VideoWriter vw, const char* name, const char* codec, double fps, int width, int height); int VideoWriter_IsOpened(VideoWriter vw); void VideoWriter_Write(VideoWriter vw, Mat img); diff --git a/videoio_test.go b/videoio_test.go index 9eccc30b..4f183a1b 100644 --- a/videoio_test.go +++ b/videoio_test.go @@ -31,7 +31,7 @@ func TestVideoWriterFile(t *testing.T) { } defer img.Close() - vw, _ := VideoWriterFile("/tmp/test.avi", 25, img.Cols(), img.Rows()) + vw, _ := VideoWriterFile("/tmp/test.avi", "MJPG", 25, img.Cols(), img.Rows()) defer vw.Close() if !vw.IsOpened() {