用c++写一段ffmpeg解析h265文件的代码
时间: 2024-02-27 18:54:11 浏览: 184
C++ 解析H264文件
以下是一段使用 C++ 和 FFmpeg 库解析 H.265 文件的示例代码:
```c++
#include <iostream>
#include <fstream>
#include <vector>
extern "C" {
#include <libavutil/frame.h>
#include <libavutil/opt.h>
#include <libavutil/pixdesc.h>
#include <libavutil/samplefmt.h>
#include <libavutil/imgutils.h>
#include <libavcodec/avcodec.h>
}
int main(int argc, char* argv[]) {
if (argc < 2) {
std::cout << "Usage: " << argv[0] << " <h265_file>" << std::endl;
return -1;
}
const char* filename = argv[1];
avcodec_register_all();
AVCodec* codec = avcodec_find_decoder(AV_CODEC_ID_HEVC);
if (!codec) {
std::cout << "Failed to find HEVC codec" << std::endl;
return -1;
}
AVCodecContext* codec_context = avcodec_alloc_context3(codec);
if (!codec_context) {
std::cout << "Failed to allocate codec context" << std::endl;
return -1;
}
if (avcodec_open2(codec_context, codec, NULL) < 0) {
std::cout << "Failed to open codec" << std::endl;
return -1;
}
AVPacket packet;
av_init_packet(&packet);
std::ifstream file(filename, std::ios::binary | std::ios::ate);
if (!file.is_open()) {
std::cout << "Failed to open file" << std::endl;
return -1;
}
std::streamsize size = file.tellg();
file.seekg(0, std::ios::beg);
std::vector<char> buffer(size);
if (!file.read(buffer.data(), size)) {
std::cout << "Failed to read file" << std::endl;
return -1;
}
uint8_t* data = reinterpret_cast<uint8_t*>(buffer.data());
int data_size = static_cast<int>(buffer.size());
while (data_size > 0) {
int ret = avcodec_send_packet(codec_context, &packet);
if (ret < 0) {
std::cout << "Error sending packet to decoder" << std::endl;
break;
}
ret = avcodec_receive_frame(codec_context, frame);
if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) {
break;
} else if (ret < 0) {
std::cout << "Error receiving frame from decoder" << std::endl;
break;
}
// Do something with the frame...
av_frame_unref(frame);
}
avcodec_free_context(&codec_context);
return 0;
}
```
这段代码使用 FFmpeg 库中的 AVCodec 和 AVCodecContext 结构体,并使用 avcodec_send_packet() 和 avcodec_receive_frame() 函数来解码 H.265 文件中的数据。在解码每个数据包后,代码可以对解码后的帧进行处理,例如将其编码为另一种格式或显示在屏幕上。注意,这段代码假设输入文件中只包含一个 H.265 数据流。如果文件中包含多个数据流,则需要使用不同的 AVPacket 对象来传递每个数据流。
阅读全文