将v4l2像素格式代码映射到ffmpeg像素格式名称

时间:2019-12-12 15:42:47

标签: go ffmpeg libav v4l2

我正在构建一个可从任何受v4l2支持的网络摄像头捕获帧的应用程序。我正在使用v4l2(golang软件包https://github.com/blackjack/webcam)控制相机,我需要做的一件事情就是像素格式。但是,我得到的是uint32,表示v4l2中的格式。

我通过包装ffmpeg命令并读取其stdout来进行流传输:

args := []string{
    "-f", "v4l2",
    "-c:v", "rawvideo",
    "-pix_fmt", pixFmt,
    "-s", size,
    "-i", input,
    "-f", "image2pipe",
    "-c:v", "mjpeg",
    "-qscale:v", "5",
    "-", // pipes to stdout
}

cmd := exec.Command("ffmpeg", args...)

现在的问题是-pix_fmt选项要求使用ffmpeg可以识别的字符串格式名称(例如8位Bayer RGGB8对应于bayer_rggb8,而v4l2中的这种格式具有代码{{1 }}。

我在ffmpeg的1111967570中找到了它的映射代码:https://github.com/FFmpeg/FFmpeg/blob/master/libavdevice/v4l2-common.h包含了我需要的功能,但是不知何故我无法在CGo中包含libavdevice({ {1}}):

<libavdevice/v4l2-common.h>

构建输出返回:

<libavdevice/avdevice.h>

package conv /* #cgo pkg-config: libavdevice #include <libavdevice/avdevice.h> #include <libavdevice/v4l2-common.h> */ import "C" type ( ) // PixFmtToFF takes v4l2 pixel format code and converts it to a string // recognized by ffmpeg command // example: 1111967570 to "bayer_rggb8" func PixFmtToFF(v4l2code uint32) (string, error) { // should work something like this, couldn't test codecID := C.ff_fmt_v4l2codec(v4l2code) pixFmt := C.ff_fmt_v4l2ff(vfd.pixelformat, codec_id) return C.av_get_pix_fmt_name(pixFmt) } 的输出为go build \ -mod=vendor \ -o ./bin/camera-api \ ./cmd/camera-api # kca/internal/camera/conv internal/camera/conv/convert.go:6:11: fatal error: libavdevice/v4l2-common.h: No such file or directory #include <libavdevice/v4l2-common.h> ^~~~~~~~~~~~~~~~~~~~~~~~~~~ compilation terminated. make: *** [Makefile:13: build/camera-api] Error 2 make: *** [builder/camera-api] Error 2

所以,我有两个问题:

1)如何包含pkg-config --libs libavdevice,以便可以使用映射功能?

2)有更好的方法吗?我需要ffmpeg包装,以便我们可以为捕获的帧支持多种格式。

0 个答案:

没有答案