- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试让自定义 IO 与 JavaCPP FFMPEG 一起使用。有人成功了吗?你可以发布你的代码吗?
这是我的(Scala),它不起作用。它编译并运行,但似乎没有调用我的 Read 和 Seek 方法
val readPtr = new Pointer()
val seekPtr = new Pointer()
val userDataPtr = new Pointer()
val read = new Read_packet_Pointer_BytePointer_int(readPtr) {
override def call(userDataPtr: Pointer, @Cast(Array("uint8_t*")) buf: BytePointer, buf_size: Int): Int = {
super.call(userDataPtr, buf, buf_size)
}
}
val seek = new Seek_Pointer_long_int(seekPtr) {
@Cast(Array("int64_t")) override def call(userDataPtr: Pointer, @Cast(Array("int64_t")) offset: Long, whence: Int): Long = {
super.call(userDataPtr, offset, whence)
}
}
val bufferSize = 1024 * 1024
val readBuffer = new BytePointer(bufferSize)
val avioContext = avformat.avio_alloc_context(
readBuffer, // internal buffer
bufferSize, // and its size
0, // write flag (1=true,0=false)
userDataPtr, // user data, will be passed to our callback functions
read,
null, // no writing
seek
)
formatContext.pb(avioContext)
formatContext.flags(formatContext.flags | avformat.AVFormatContext.AVFMT_FLAG_CUSTOM_IO)
formatContext.iformat(avformat.av_find_input_format("mp4"))
avformat.avformat_open_input(formatContext, null.asInstanceOf[String], null, null)
最佳答案
经过一番努力,我终于得到了它。这是我练习 CustomerIO、Fifo、Format 和 Codec 的工作代码。我希望它可以为一些 future 的开发人员节省很多时间。享受
import java.io.{FileInputStream, RandomAccessFile}
import java.nio.ByteBuffer
import org.bytedeco.javacpp.avformat._
import org.bytedeco.javacpp.avutil.AVDictionary
import org.bytedeco.javacpp._
import org.bytedeco.javacpp.annotation.Cast
import org.bytedeco.javacpp.avcodec.{AVCodecContext, AVPacket}
/**
* User: peter
* Date: 2/17/17
* Time: 7:47 PM
*/
object FFMEGTest2 extends App {
val AVERROR_NONE = 0
val AVERROR_EAGAIN = -11
val AVERROR_RESOURCE_NOT_AVAILABLE = -35
def chk( x: Int ) = {
if( x < 0 ) {
val errormsgBytes = new Array[Byte](1024)
avutil.av_strerror(x, errormsgBytes, 1024)
throw new Error(new String(errormsgBytes).trim)
}
x
}
def chkNull[T]( x: T ) = {
if(x==null) {
throw new Error("Unable to allocate object")
}
x
}
avformat.av_register_all()
val mp4 = "foo.mp4"
val ogg = "bah.ogg"
doit(mp4, "mp4")
doit(ogg, "ogg")
def doit( path: String, fmt: String ): Unit = {
val input = new RandomAccessFile(path,"r")
val data = new Array[Byte](input.length().toInt)
input.read(data, 0, data.length)
doit(data,fmt)
}
def doit( data: Array[Byte], fmt: String ) = {
val pointerPointer = new PointerPointer(1)
val lineSizePtr = new IntPointer(1L)
chk(avutil.av_samples_alloc(pointerPointer,lineSizePtr,1,4096,8,0))
var offset = 0
object ReadInput extends Read_packet_Pointer_BytePointer_int {
override def call(opaque: Pointer, buffer: BytePointer, buffer_size: Int): Int = {
try {
println(s"read ${offset} ${buffer_size}")
if (offset >= data.length) {
avutil.AVERROR_EOF
}
else {
val avail = data.length - offset
val l = if( avail < buffer_size ) avail else buffer_size
//Array.copy(data,offset,buffer,0,avail)
buffer.put(data, offset, l)
offset += l
l
}
}
catch {
case t: Throwable =>
throw new Error("Error on InputStream.read(): ", t)
}
}
}
object SeekInput extends Seek_Pointer_long_int {
@Cast(Array("int64_t")) override def call(userDataPtr: Pointer, @Cast(Array("int64_t")) where: Long, whence: Int): Long = {
/*
#define SEEK_SET 0 // Seek relative to begining of file
#define SEEK_CUR 1 // Seek relative to current file position
#define SEEK_END 2 // Seek relative to end of file
avformat.AVSEEK_SIZE
ORing this as the "whence" parameter to a seek function causes it to
return the filesize without seeking anywhere. Supporting this is optional.
If it is not supported then the seek function will return <0.
*/
try {
val whence2 = whence & ~avformat.AVSEEK_SIZE
whence2 match {
case 0 => offset = where.toInt
case 1 => offset = offset + where.toInt
case 2 => offset = data.length - where.toInt
case _ =>
throw new Error(s"Unknown whence on InputStream.seek(): ${where} ${whence2} ")
}
if( (whence & avformat.AVSEEK_SIZE) != 0) data.length else 0
} catch {
case t: Throwable =>
throw new Error("Error on InputStream.reset() or skip(): ", t)
}
}
}
val avioBufferSize = 4096
val avioBuffer = new BytePointer(avutil.av_malloc(avioBufferSize))
val formatContext = chkNull(avformat.avformat_alloc_context())
val avioContext = chkNull(avformat.avio_alloc_context(
avioBuffer,
avioBufferSize,
0,
formatContext,
ReadInput,
null,
SeekInput))
formatContext.pb(avioContext)
val inputFormat = chkNull(avformat.av_find_input_format(fmt))
formatContext.iformat(inputFormat)
chk(avformat.avformat_open_input(formatContext, "", null, null))
val audioStreams = (0 until formatContext.nb_streams) filter { i: Int =>
formatContext.streams(i).codec().codec_type() == avutil.AVMEDIA_TYPE_AUDIO
}
audioStreams.foreach { audioStream =>
val codecContext = formatContext.streams(audioStream).codec()
val decoder = chkNull(avcodec.avcodec_find_decoder(codecContext.codec_id))
chk(avcodec.avcodec_open2(codecContext, decoder, null.asInstanceOf[AVDictionary]))
val fifo = chkNull(avutil.av_audio_fifo_alloc(
8,
1,
1024*1024))
var more = true
while (more) {
val packet = new AVPacket
avcodec.av_init_packet(packet)
if (avformat.av_read_frame(formatContext, packet) == 0) {
chk(avcodec.avcodec_send_packet(codecContext, packet))
val frame = avutil.av_frame_alloc()
val errno = avcodec.avcodec_receive_frame(codecContext, frame)
errno match {
case avutil.AVERROR_EOF => more = false
// try again, read another packet
case AVERROR_EAGAIN =>
case AVERROR_RESOURCE_NOT_AVAILABLE =>
case AVERROR_NONE =>
chk(avutil.av_audio_fifo_write(fifo,frame.buf,frame.nb_samples))
println(s"${avutil.av_audio_fifo_size(fifo)} ${frame.nb_samples} ${frame.format} ${frame.best_effort_timestamp} ${frame.channels} ${frame.decode_error_flags} ${frame.flags} ${frame.sample_rate}")
if(avutil.av_audio_fifo_size(fifo) >= 4096) {
chk(avutil.av_audio_fifo_read(fifo,pointerPointer,4096))
val byteBuf = ByteBuffer wrap(new Array[Byte](4096*4))
chk(avutil.av_samples_copy(byteBuf,pointerPointer.get(0).asByteBuffer(),0,0,4096,1,8))
val samples = ByteBuffer.wrap(byteBuf.array()).asFloatBuffer()
}
case code: Int =>
chk(code)
}
avutil.av_frame_free(frame)
} else more = false
avcodec.av_packet_unref(packet)
}
avutil.av_audio_fifo_free(fifo)
avcodec.avcodec_close(codecContext)
}
avformat.avformat_close_input(formatContext)
}
}
关于java - 寻找 Javacpp FFMPEG CustomIO 示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42400811/
在CentOS中,使用javacpp调用FFmpeg做视频裁剪一帧,在我自己的开发机上使用这段代码是没有问题的,但是在centos6中报NoClassDefFound: Could not initi
我正在使用 JavaCPP 为 C++ 项目实现 Java 包装器。我已经为所有自定义类型定义了映射,但我在调用 std::sort_heap() 时遇到了困难。以函数作为参数的函数。 这是C++代码
我想为tesseract建立一个胖子 jar 。通过以下构 build 置,我得到了一个约68 MB的jar,带有所有受支持平台的依赖项: dependencies { implementat
javacpp-opencv drawContours产生的结果比python错误。 这是Java中使用drawContours函数的代码: public static void main(Strin
我正在尝试在 http://code.google.com/p/javacpp/ 上运行自己的 LegacyLibrary 示例 当我尝试使用仅在站点中提到的以下命令编译代码时(基本上是使用 java
JavaCpp在哪里寻找原生库libmynativelib.so当它创建 jni 库时,/linux-x86_64/libjnimynativelib.so ? 使用@Platform向JavaCpp
@MemberGetter 之间有什么区别?和 @ValueGetter JavaCPP 中的注释? 它们的用例是什么? 我有两个常量的 C 头文件 static const int TRANSPOS
抱歉英语不好,不是母语人士。 我正在使用 github 上提供的 sourab-sharma 的 TouchToRecord 库,我更新了 javacv 和 javacpp,现在应用程序在视频记录中崩
我想在hadoop上运行一个应用程序,在该应用程序中,我具有以下导入:“import com.googlecode.javacpp.BytePointer”。在hadoop上运行它后,我得到了: 13
我正在尝试使用 JavaCPP 为某些 C++ 库创建 java 绑定(bind)。该过程有2个方面 需要构建一个 linux 共享库 (.so),其中包含 native 入口点 (JNIEXPORT
我正在使用 javacpp-presets/opencv这是 opencv 的 java 包装器。我的问题是如何获取 Mat 对象中的像素值或如何将 Mat 对象转换为多维 java 数组? 我正在使
在我的 64 位 Mac OSX 上尝试使用来自 java 项目的 native C++ 库,正如此链接中所述: https://github.com/bytedeco/javacpp-presets
我正在尝试让自定义 IO 与 JavaCPP FFMPEG 一起使用。有人成功了吗?你可以发布你的代码吗? 这是我的(Scala),它不起作用。它编译并运行,但似乎没有调用我的 Read 和 Seek
我们正在尝试使用 javacpp 重新编译 ffmpeg 项目,并启用 --enable-libfdk-aac ,构建可以正常工作,但我们无法使用 libfdk_aac 来解码 audio_strea
我正在尝试使用 JDK 1.7.0 和 JavaCpp 0.3 (bin) 在 Windows XP Professional (x86) 上使用 Visual Studio 2008 构建和运行 J
我正在尝试为 LLVM 使用 javacpp-presets,但似乎存在链接时间问题:每当我尝试运行我的程序时,我都会收到错误 "Exception in thread "main" java.lan
我正在尝试使用 this我的 java 应用程序中的示例是使用 maven 构建的。pom.xml 包含 org.codehaus.mojo
我有一个c++ 头文件,其中包含一些c++ 代码调用的函数。这些函数应该映射到相应的 Java 函数。所以它有点像回调,但我不知道如何在 JavaCpp 中映射它们。 例如我们有一个头文件: #ifd
我正在尝试使用 javacpp,但在使用 eclipse (+ mac OS) 时遇到了一些困难。 当我在我的命令行中运行它时 - 它工作正常: #include namespace LegacyL
我想使用JavaCPP从java代码调用c++代码。 我正在尝试在 http://code.google.com/p/javacpp/ 上运行自己的 LegacyLibrary 示例 当我尝试使用仅在
我是一名优秀的程序员,十分优秀!