FFMPEG Android - 将字节缓冲区传递给 ffmpeg
我正在尝试 ffmpeg,但我不知道如何通过 bytebuffer 到 FFmpeg 方法 avcodec_decode_audio3
。
在 JNI 代码中,我可以通过 GetDirectBufferAddress 访问字节缓冲区,这为我提供了 jbyte 类型的对象。如何将其传递给 ffmpeg 的 avcodec_decode_audio3
方法?
avcodec_decode_audio3
的方法声明是
avcodec_decode_audio3(AVCodecContext *avctx, int16_t *samples, int
*frame_size_ptr, AVPacket *avpkt)
以前有人做过吗?
有人可以解释一下吗?如果有人能给我一个如何完成此操作的片段,那将非常有用。
I'm trying my hands on ffmpeg and am stuck on how I pass the
bytebuffer to the FFmpeg method avcodec_decode_audio3
.
In the JNI code I'm able to access the bytebuffer through GetDirectBufferAddress
which gives me an object of the type jbyte. How do I pass this to the avcodec_decode_audio3
method of ffmpeg?
The method declaration for is avcodec_decode_audio3
is
avcodec_decode_audio3(AVCodecContext *avctx, int16_t *samples, int
*frame_size_ptr, AVPacket *avpkt)
Has anyone done this before.
Can someone throw some light on this? If someone can give me a snippet of how this is done it would be very useful.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
我开始了一个简单的项目,使用 ffmpeg 进行解码。我已经成功地用Java编译ffmpeg、获取流、解码并将pcm数据返回到AudioTrack。唯一的问题是我只得到噪音,但我正在努力解决它。在这里查看https://github.com/mikebevz/AFPlayer
I have started a simple project where I use ffmpeg for decoding. I have already managed to compile ffmpeg, get stream, decode and return pcm data to AudioTrack in Java. The only problem is that I get only noize back, but I'm working on it. Check it here https://github.com/mikebevz/AFPlayer
不要将其视为 jbyte 类型,而是将值放入 unsigned char *pBuffer
char *pBuffer = (*env)->GetDirectBufferAddress(env,buf);
您需要将其类型转换为 int16_t *samples 类型
然后将其传递给 avcodec_decode_audio3(..... .pBuffer....);
复制到这里就完成了:
memcpy(样本,frame.extended_data[0],plane_size);
Dont take it as type jbyte , rather take the value into unsigned char *pBuffer
char *pBuffer = (*env)->GetDirectBufferAddress(env,buf);
you need to typecast it to type of int16_t *samples
then pass it to avcodec_decode_audio3(..... .pBuffer....);
and here the copying is done :
memcpy(samples, frame.extended_data[0], plane_size);