- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用自定义 AVIOContext 将 FFMpeg 与 java IO 连接起来。函数avformat_open_input()
永远不会回来。我在网上搜索过类似的问题,都是由于网络故障或服务器配置错误造成的。但是,我根本没有使用网络,正如您在以下小程序中看到的那样:
package com.example;
import org.bytedeco.javacpp.*;
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import static org.bytedeco.javacpp.avcodec.*;
import static org.bytedeco.javacpp.avformat.*;
import static org.bytedeco.javacpp.avutil.*;
import static org.bytedeco.javacpp.avdevice.*;
import static org.bytedeco.javacpp.avformat.AVFormatContext.*;
public class Test {
public static void main(String[] args) throws Exception {
File dir = new File(System.getProperty("user.home"), "Desktop");
File file = new File(dir, "sample.3gp");
final RandomAccessFile raf = new RandomAccessFile(file, "r");
Loader.load(avcodec.class);
Loader.load(avformat.class);
Loader.load(avutil.class);
Loader.load(avdevice.class);
Loader.load(swscale.class);
Loader.load(swresample.class);
avcodec_register_all();
av_register_all();
avformat_network_init();
avdevice_register_all();
Read_packet_Pointer_BytePointer_int reader = new Read_packet_Pointer_BytePointer_int() {
@Override
public int call(Pointer pointer, BytePointer buf, int bufSize) {
try {
byte[] data = new byte[bufSize]; // this is inefficient, just use as a quick example
int read = raf.read(data);
if (read <= 0) {
System.out.println("EOF found.");
return AVERROR_EOF;
}
System.out.println("Successfully read " + read + " bytes of data.");
buf.position(0);
buf.put(data, 0, read);
return read;
} catch (Exception ex) {
ex.printStackTrace();
return -1;
}
}
};
Seek_Pointer_long_int seeker = new Seek_Pointer_long_int() {
@Override
public long call(Pointer pointer, long offset, int whence) {
try {
raf.seek(offset);
System.out.println("Successfully seeked to position " + offset + ".");
return offset;
} catch (IOException ex) {
return -1;
}
}
};
int inputBufferSize = 32768;
BytePointer inputBuffer = new BytePointer(av_malloc(inputBufferSize));
AVIOContext ioContext = avio_alloc_context(inputBuffer, inputBufferSize, 1, null, reader, null, seeker);
AVInputFormat format = av_find_input_format("3gp");
AVFormatContext formatContext = avformat_alloc_context();
formatContext.iformat(format);
formatContext.flags(formatContext.flags() | AVFMT_FLAG_CUSTOM_IO);
formatContext.pb(ioContext);
// This never returns. And I can never get result.
int result = avformat_open_input(formatContext, "", format, null);
// all clean-up code omitted for simplicity
}
}
Successfully read 32768 bytes of data.
Successfully read 32768 bytes of data.
Successfully read 32768 bytes of data.
Successfully read 32768 bytes of data.
Successfully read 32768 bytes of data.
Successfully read 7240 bytes of data.
EOF found.
avformat_open_input()
甚至会读取整个文件并且仍然没有返回?我的所作所为一定有问题。任何专家都可以阐明一些观点或指出正确的方向吗?我是
javacv
的新手和
ffmpeg
尤其是使用
Buffer
进行编程s 和东西。欢迎任何帮助、建议或批评。提前致谢。
最佳答案
好的,现在我找到了问题所在。我有 误解 文档和 被忽视的我发现的大多数例子。我的错。
根据 ffmpeg 上的文档:
AVIOContext* avio_alloc_context (unsigned char* buffer,
int buffer_size,
int write_flag,
void* opaque,
int(*)(void *opaque, uint8_t *buf, int buf_size) read_packet,
int(*)(void *opaque, uint8_t *buf, int buf_size) write_packet,
int64_t(*)(void *opaque, int64_t offset, int whence) seek
)
write_flag
以下列方式使用:
1
如果缓冲区应该是可写的,0
否则。
AVIOContext
用于数据输出(即写入),
write_flag
应设置为
1
.否则,如果上下文用于数据输入(即读取),则应将其设置为
0
.
1
作为
write_flag
它在阅读时引起了问题。路过
0
而是解决了问题。
avio_alloc_context()
通话使用
0
,而不是
1
阅读时。因此,这进一步表明了我遇到问题的原因。
package com.example;
import org.bytedeco.javacpp.*;
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import static org.bytedeco.javacpp.avformat.*;
import static org.bytedeco.javacpp.avutil.*;
import static org.bytedeco.javacpp.avformat.AVFormatContext.*;
public class Test {
public static void main(String[] args) throws Exception {
File dir = new File(System.getProperty("user.home"), "Desktop");
File file = new File(dir, "sample.3gp");
final RandomAccessFile raf = new RandomAccessFile(file, "r");
Loader.load(avformat.class);
Loader.load(avutil.class);
av_register_all();
avformat_network_init();
Read_packet_Pointer_BytePointer_int reader = new Read_packet_Pointer_BytePointer_int() {
@Override
public int call(Pointer pointer, BytePointer buf, int bufSize) {
try {
byte[] data = new byte[bufSize]; // this is inefficient, just use as a quick example
int read = raf.read(data);
if (read <= 0) {
// I am still unsure as to return '0', '-1' or 'AVERROR_EOF'.
// But according to the following link, it should return 'AVERROR_EOF',
// http://www.codeproject.com/Tips/489450/Creating-Custom-FFmpeg-IO-Context
// btw 'AVERROR_EOF' is a nasty negative number, '-541478725'.
return AVERROR_EOF;
}
buf.position(0);
buf.put(data, 0, read);
return read;
} catch (Exception ex) {
ex.printStackTrace();
return -1;
}
}
};
Seek_Pointer_long_int seeker = new Seek_Pointer_long_int() {
@Override
public long call(Pointer pointer, long offset, int whence) {
try {
if (whence == AVSEEK_SIZE) {
// Returns the entire file length. If not supported, simply returns a negative number.
// https://www.ffmpeg.org/doxygen/trunk/avio_8h.html#a427ff2a881637b47ee7d7f9e368be63f
return raf.length();
}
raf.seek(offset);
return offset;
} catch (IOException ex) {
ex.printStackTrace();
return -1;
}
}
};
int inputBufferSize = 32768;
BytePointer inputBuffer = new BytePointer(av_malloc(inputBufferSize));
AVIOContext ioContext = avio_alloc_context(inputBuffer,
inputBufferSize,
0, // CRITICAL, if the context is for reading, it should be ZERO
// if the context is for writing, then it is ONE
null,
reader,
null,
seeker);
AVInputFormat format = av_find_input_format("3gp");
AVFormatContext formatContext = avformat_alloc_context();
formatContext.iformat(format);
formatContext.flags(formatContext.flags() | AVFMT_FLAG_CUSTOM_IO);
formatContext.pb(ioContext);
// Now this is working properly.
int result = avformat_open_input(formatContext, "", format, null);
System.out.println("result == " + result);
// all clean-up code omitted for simplicity
}
}
AVSEEK_SIZE
documentation avio_alloc_context()
documentation http://www.codeproject.com/Tips/489450/Creating-Custom-FFmpeg-IO-Context
write_flag
的示例在 avio_alloc_context()
在:https://www.ffmpeg.org/doxygen/2.5/avio_reading_8c-example.html#a20
关于ffmpeg - JavaCV:avformat_open_input() 挂起(不是网络,而是使用自定义 AVIOContext),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33109402/
尝试使用 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(它只检测直线而不
我是一名优秀的程序员,十分优秀!