- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我想从 android 直播到 facebook。我能够将现有示例改编为流式传输到 FB。
第一步或多或少是可行的(音频仍然是个问题,但不在她的范围内)。我可以流式传输到 FB。
我现在想用透明的 png 图像覆盖流。
我在启动时创建了一个 FFmpegFrameFilter:
try{
filter = new FFmpegFrameFilter("movie="+path+"/image.png [logo];[in][logo]overlay=0:0:format=rgb [out]",imageWidth, imageHeight);
filter.start();
}catch (FrameFilter.Exception e){
Log.e(CLASS_LABEL,"Error while starting filter: "+e.getMessage());
e.printStackTrace();
}
并且在每一帧上我执行以下操作:
filter.push(yuvImage);
Frame frame;
while ((frame = filter.pull()) != null) {
recorder.record(frame,avutil.AV_PIX_FMT_NV21);
}
问题是我不知道应该使用哪种像素格式。我的叠加图像具有 rgb 颜色 ( https://postimg.org/image/f1ri3vj43/ )
使用上面的像素格式,我得到这样的结果:https://postimg.org/image/45ha64q9z/
我很沮丧,因为我已经尝试过很多像素格式。都有不同的输出,有时 Logo 会出现多次。
有没有办法找出我应该从 avutil.java 可能性中选择哪一个?
编辑:您可以在 https://github.com/y4nnick/android_streaming/blob/master/app/src/main/java/com/example/yannick/olay1/RecordActivity.java 上找到完整代码
编辑:我已经尝试过以下格式:
// AV_PIX_FMT_ARGB --> 4 at once, all black/white
// AV_PIX_FMT_0RGB --> 4 at once, all black/white
// AV_PIX_FMT_BGR8 --> 1 a bit to big, strange colors
// AV_PIX_FMT_BGR4_BYTE --> 1 a bit to big, stranger blue tint
// AV_PIX_FMT_YUVA422P_LIBAV --> error: Cannot initialize the conversion context.
// AV_PIX_FMT_FLAG_ALPHA --> error: Cannot initialize the conversion context.
// AV_PIX_FMT_FLAG_PLANAR --> error: Cannot initialize the conversion context.
// AV_PIX_FMT_RGB4 --> error: Cannot initialize the conversion context.
// AV_PIX_FMT_RGB32_1 --> 4 at a time, all black/white
// AV_PIX_FMT_0BGR --> 4 at a time, all black/white
// AV_PIX_FMT_YVYU422 --> 2 side by side, gruen, purple tint
// AV_PIX_FMT_YUVJ422P --> Fatal signal 11 (SIGSEGV) at 0x61f7xf000 (code=1), thread 18401 (e.yannick.olay1)
// AV_PIX_FMT_BAYER_BGGR8 --> 1 a bit to big, black/white
// AV_PIX_FMT_BAYER_GBRG8 --> 1 a bit to big, black/white
// AV_PIX_FMT_FLAG_RGB --> 2 a bit to big, black/white
// AV_PIX_FMT_RGB555LE --> 2 a bit to big, strange colors
// AV_PIX_FMT_RGB555BE --> 2 a bit to big, strange colors
// AV_PIX_FMT_RGB555 --> 2 a bit to big, strange colors
// AV_PIX_FMT_RGB4_BYTE --> 1 a bit to big, orange tint
// AV_PIX_FMT_RGBA64 --> 8 side by side, black/white
// AV_PIX_FMT_RGB24 --> 3 side by side, red tint
最佳答案
我想通了:
通过运行找出你的 android 相机支持哪些格式
mCamera = Camera.open();
Camera.Parameters params = mCamera.getParameters();
for(int i: params.getSupportedPreviewFormats()) {
Log.e(TAG, "preview format supported are = "+i);
}
您将获得一个整数列表。在我的例子中是 17 和 842094169。我会选择 842094169 (YV12)。所以通过调用将你的相机设置为那个
mCamera.getParameters().setPreviewFormat(ImageFormat.YV12);
转到 https://developer.android.com/reference/android/graphics/ImageFormat.html并检查您支持的格式是如何准确定义的。842094169 是 YV12 是一种 4:2:0 YCrCb 平面格式,由一个 WxH Y 平面和后跟 (W/2) x (H/2) Cr 和 Cb 平面组成。
转到 https://ffmpeg.org/ffmpeg-filters.html#overlay-1并检查您喜欢使用的过滤器,我的是叠加过滤器。此过滤器提供了一个名为“格式”的参数,将其设置为最接近(YV12 不在列表中)的相机。在我的例子中是“yuv420”。过滤器现在看起来像这样:
filter = new FFmpegFrameFilter("movie="+path+"/image.png [logo];[in][logo]overlay=0:0:format=yuv420 [out]",imageWidth, imageHeight);
记录帧时设置正确的像素格式:
Frame frame;
while ((frame = filter.pull()) != null) {
Log.i(LOG_TAG,"In record-pull");
recorder.record(frame,avutil.AV_PIX_FMT_YUV420P);
}
事实上,您必须将所有像素格式设置为相同。搜索所有站点以找到所有“组件”都支持的格式有点棘手。
建议的替代方法是将 YUV 图像从相机转换为 RGB 图像。参见 Converting YUV->RGB(Image processing)->YUV during onPreviewFrame in android?
我没有尝试过,因为我教过这会很慢,所以我先尝试了一个更简单的解决方案。
关于android - javaCV Android,在流式传输到 rtmp 服务器时叠加层出现奇怪的颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39479205/
尝试使用 JAVACV 库从网络摄像头捕获。但它会抛出一个 UnsatisfiedLinkError。堆栈轨迹如下: Exception in thread "main" java.lang.Unsa
尝试使用 JavaCV 进行图像处理以根据其 Exif 数据旋转图像。从文件读取和写入 Mat 或 IplImage 是可行的,但由于正在上传或下载文件,我也希望能够做同样的事情来处理 byte[]
我正在尝试实现使用 JavaCv Surf 的示例。我下载了示例代码、.jar 文件并安装了官方网页要求的所有内容 (http://code.google.com/p/javacv/)。但似乎缺少一个
我正在开发一个使用 Java 的应用程序,该应用程序可以纠正透视(也称为梯形校正)。为此,我使用 Bytedeco's JavaCV 。引用documentations和其他几个websites和在线
我是 JavaCV/OpenCV 的新手,所以如果我是一个完全的白痴,请提前道歉...... 我需要检测图像中的“主要/主要”人脸(此图像大部分是“个人资料图片”),人脸识别 不需要。 由于不同haa
我想通过 Java 轻松捕获我的网络摄像头。我按照本教程使用 JavaCV 和 OpenCV:http://ganeshtiwaridotcomdotnp.blogspot.com/2011/12/o
我在使用 JavaCV 时遇到问题。 我下载了javaCV-bin 我在 ubuntu 上的引用库中的项目中添加了 .jar 文件 我可以使用位于下载文件中的示例代码 但是错误是 Exception
我正在尝试使用 JavaCV 在我的照片数据库中实现人脸识别。虽然检测可能的面孔工作正常(已经有很多 Java 示例),但我仍然坚持进行实际识别。更准确地说,是训练人脸识别器。 出于测试目的,我有一个
我正在尝试使用 JavaCV 实现使用 ORB 算法的图像识别。根据一些论文[1] , [2] ,ORB关键点描述符是一个二进制字符串。那么,如何在获取图像的关键点后得到这个二进制字符串呢? 这是我获
我对 JavaCV FFmpegFrameRecorder 的使用有点困惑。我有几个 byte[] 或 short[] 数组(取决于我的图像是 8 位还是 16 位)是否有与多个图像相关的数据。现在,
我正在尝试使用 Java 从相机获取一些图像,但我遇到了一些问题;任何帮助将不胜感激! 代码如下: 错误日志: Exception in thread "main" java.
以下 JavaCV 代码有什么问题?我尝试填充 CvSeq 以进行进一步的工作,但 JVM 几乎 在不同位置可靠地崩溃,并出现 EXCEPTION_ACCESS_VIOLATION,最常见的是 [ms
我正在尝试过滤掉图像中的轮廓。我的代码没有语法错误,但当我运行程序时,我只是得到很多红色文本。我已定位故障点为cvInRangeS。 cvInRangeS(imghsv,minc,maxc,imgbi
我刚刚找到了一个很好的 JavaCV 示例,它使用 FFmpegFrameGrabber为应该“快”的Linux制作屏幕截图代码: try { int x = 0, y = 0, w = 13
我正在尝试使用 HoughCircles 的 JavaCV 实现方法,但我在参数方面遇到了一些问题。这是我的代码: Mat currentImageGray = tgtFrag.getImage().
我正在尝试使用 FFmpegFrameRecorder 从一组图像中制作一个视频 .mp4 文件作为更大程序的一部分,因此我设置了一个测试项目,在其中尝试制作一个25fps 的同一帧的 100 个实例
我想不断捕捉网络摄像头并让它在 Canvas 上查看。图像的保存很好。它每秒拍摄一张照片。但是 canvas.showImage() 不起作用。我的屏幕仍然空白。控制台在每一帧都显示“清理相机”。 头
我从昨天开始用 android 做 javacv,在使用 FFmpegFrameRecorder 或 FrameRecorder 从图像 (IplImage) 生成视频时出错,同时在使用 cvCvtC
我在我的项目中使用 javaCV 信封,当我尝试使用 cvLoad 函数从 xml (haarcascade_frontalface_default.xml) 加载 Haar 级联时,我从中得到 nu
我在使用 JavaCV 实现的这个项目中遇到了问题。我想至少找到二值图像中最顶部、最底部、最左侧和最右侧的点: 我这里指的点是 (x,y) 坐标。我已经尝试实现 HoughLines(它只检测直线而不
我是一名优秀的程序员,十分优秀!