Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 将v4l2像素格式代码映射到ffmpeg像素格式名称_Go_Ffmpeg_Libav_V4l2 - Fatal编程技术网

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

Go 将v4l2像素格式代码映射到ffmpeg像素格式名称,go,ffmpeg,libav,v4l2,Go,Ffmpeg,Libav,V4l2,我正在构建一个应用程序,可以从任何支持v4l2的网络摄像头捕获帧。我用v4l2(golang软件包)控制相机,我需要的东西之一是像素格式。然而,我得到的是表示v4l2格式的uint32 我通过包装ffmpeg命令并从其stdout读取来执行流式传输: args := []string{ "-f", "v4l2", "-c:v", "rawvideo", "-pix_fmt", pixFmt, "-s", size, "-i", input, "-f

我正在构建一个应用程序,可以从任何支持v4l2的网络摄像头捕获帧。我用v4l2(golang软件包)控制相机,我需要的东西之一是像素格式。然而,我得到的是表示v4l2格式的
uint32

我通过包装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位拜耳RGGB8对应于
Bayer_RGGB8
,而v4l2中的此格式具有code
1111967570

我在ffmpeg的
libavdevice
中找到了它的映射代码:包含了我需要的函数,但不知何故我无法在CGo中包含
(与
没有问题):

package conv
/*
#cgo-pkg-config:libavdevice
#包括
#包括
*/
输入“C”
类型(
)
//PixFmtToFF获取v4l2像素格式代码并将其转换为字符串
//由ffmpeg命令识别
//示例:1111967570至“拜耳rggb8”
func PixFmtToFF(v4l2code uint32)(字符串,错误){
//应该像这样工作,不能测试
codecID:=C.ff\u fmt\u v4l2codec(v4l2code)
pixFmt:=C.ff\u fmt\u v4l2ff(vfd.pixelformat,codec\u id)
返回C.av\U get\U pix\U fmt\U名称(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
go-build\
-mod=供应商\
-o./bin/摄像机api\
./cmd/cameraapi
#kca/内部/摄像头/转换
内部/camera/conv/convert.go:6:11:致命错误:libavdevice/v4l2 common.h:没有这样的文件或目录
#包括
^~~~~~~~~~~~~~~~~~~~~~~~~~~
编译终止。
make:**[Makefile:13:构建/摄像机api]错误2
make:**[builder/camera api]错误2
pkg config--libs libavdevice的输出是
-L/usr/local/lib-lavdevice

因此,我有两个问题:

1) 如何包括
v4l2 common.h
以便使用映射函数


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

为什么不使用ffmpeg来告诉您支持的像素格式
ffmpeg-f v4l2-list_formats all-i/dev/video0
你甚至需要声明
-pixel_format
输入选项吗?@llogan我宁愿不解析ffmpeg的文本输出,因为连接的设备不是预先确定的(可能有更多,不同的型号),并且应用程序内部正在进行设备识别,不是手动的<代码>-像素_格式
是必要的,因为有时源格式可能是原始格式(如拜耳_rggb8),在这种情况下,ffmpeg无法自行确定格式。