- 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/
我正在编写将文件作为流接收并对其进行解码的软件。我有以下用于流输入的自定义 AVIO 代码: /* Allocate a 4kb buffer for copying. */ std::uint32_
问题是为什么字段 AVFormatContext::duration 在之后未定义 avformat_open_input avformat_find_stream_info 如果在 here 中使用
我正在使用 libav 编写复用器 DirectShow 过滤器,我需要将复用器的输出重定向到过滤器的输出引脚,所以我使用 avio_alloc_context()用我的 write_packet 创
我正在使用自定义 AVIOContext 将 FFMpeg 与 java IO 连接起来。函数avformat_open_input()永远不会回来。我在网上搜索过类似的问题,都是由于网络故障或服务器
我正在阅读 ffmpeg 代码并被“AVIOContext *pb”弄糊涂了。大多数字段的名称都很简单,例如“priv_data”表示私有(private)数据,但我不知道为什么“AVIOContex
我是一名优秀的程序员,十分优秀!