我正在构建一个可从任何受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包装,以便我们可以为捕获的帧支持多种格式。