bytedeco/javacv
View on GitHubHow to convert Frame to AVPacket,or directly convert the image to AVPacket?(javacv1.5.9)
Open
#2,143 opened on Dec 13, 2023
enhancementhelp wantedquestion
Repository metrics
- Stars
- (6,985 stars)
- PR merge metrics
- (No merged PRs in 30d)
Description
How to convert org.bytedeco.javacv.Frame to org.bytedeco.ffmpeg.avcodec.AVPacket,or directly convert the image to AVPacket? This is my current approach:
"Start -->Get the JavaCV frame
Get Javacv frame -->convert to AVFrame
Convert to AVFrame -->Encode to AvPacket
Encode as AvPacket -->End"
java code:
recorder.setVideoCodec(AV_CODEC_ID_H264);
recorder.setPixelFormat(AV_PIX_FMT_YUV420P);
recorder.setFormat("rtsp");
recorder.start();
File imageFolder = new File(inputFolder);
File[] imageFiles = imageFolder.listFiles();
Java2DFrameConverter converter = new Java2DFrameConverter();
if (imageFiles != null) {
Frame frame = null;
//Convert image to Frame in loop
for (int i = startIdx; i < imageFiles.length; i++) {
File imageFile = imageFiles[i];
lastProcessedFile = imageFile.getAbsolutePath();
BufferedImage read = ImageIO.read(imageFile);
frame = converter.convert(read);
//TODO convert Frame to AVPacket
recorder.recordPacket(packet);
}
}
I don't know how to directly convert images to AVPackets.
AVCodec codec = avcodec.avcodec_find_encoder(avcodec.AV_CODEC_ID_H264);
AVCodecContext codecContext = avcodec.avcodec_alloc_context3(codec);
AVFrame avFrame = avutil.av_frame_alloc();
avFrame.width(frame.imageWidth);
avFrame.height(frame.imageHeight);
avFrame.format(frame.imageChannels);
//There is a problem with this.
//AVFrame only has these two methods: public BytePointer data (int i) and public AVFrame data (int i, BytePointer setter)
avFrame.data(frame.image[0]);
avFrame.linesize(frame.imageStride);
AVPacket avPacket = avcodec.av_packet_alloc();
avcodec.avcodec_send_frame(codecContext, avFrame);
avcodec.avcodec_receive_packet(codecContext, avPacket);
For YUV420P, I need to fill in the data [0], data [1], and data [2] of the avframe separately based on my research. How to modify this code: avFrame. data (frame. image [0]);?