gpt4 book ai didi

c++ - 如何使用 FFMPEG 从编码视频中提取 AVPacket 的重要信息

转载 作者:行者123 更新时间:2023-12-04 23:08:37 25 4
gpt4 key购买 nike

我编写了一个代码来读取编码域中的视频,并能够检索帧的大小和持续时间等信息。 AVPacket 类由一个变量作为数据组成。我可以阅读它,但由于它是一个咬数组,我不能以可读格式使用它。我想用这个数据与另一个视频文件进行比较。请帮忙。

void CFfmpegmethods::VideoRead(){
av_register_all();
avformat_network_init();
ofstream outdata;
const char *url = "H:\\Sanduni_projects\\Sample_video.mp4";
AVDictionary *options = NULL;
AVFormatContext *s = avformat_alloc_context(); //NULL;

AVPacket *pkt = new AVPacket();

//open an input stream and read the header
int ret = avformat_open_input(&s, url, NULL, NULL);

//avformat_find_stream_info(s, &options); //finding the missing information

if (ret < 0)
abort();

av_dict_set(&options, "video_size", "640x480", 0);
av_dict_set(&options, "pixel_format", "rgb24", 0);

if (avformat_open_input(&s, url, NULL, &options) < 0){
abort();
}

av_dict_free(&options);

AVDictionaryEntry *e;

if (e = av_dict_get(options, "", NULL, AV_DICT_IGNORE_SUFFIX)) {
fprintf(stderr, "Option %s not recognized by the demuxer.\n", e->key);
abort();
}

int i = 1;
int j = 0;
int64_t duration = 0;
int size = 0;
uint8_t *data = 0; //Unsigned integer type with a width of exactly 8 bits.
int sum = 0;

int total_size = 0;
int total_duration = 0;
int packet_size = 0;
int64_t stream_index = 0;
int64_t bit_rate = 0;

//writing data to a file
outdata.open("H:\\Sanduni_projects\\log.txt");

if (!outdata){
cerr << "Error: file could not be opened" << endl;
exit(1);
}

//Split what is stored in the file into frames and return one for each call
//returns the next frame of the stream

while(1){
int frame = av_read_frame(s, pkt);
if (frame < 0) break;

duration = pkt->duration;
size = pkt->size;

total_size = total_size + size;
total_duration = total_duration + duration;

cout << "frame:" << i << " " << size << " " << duration << endl;
data = pkt->data;
outdata << "Frame: " << i << " ";
outdata << data<< endl;

for (j = 0; j < size; j++){

}

i++;
//pkt_no++;
//outdata << sum << endl;
}

//make the packet free
av_packet_unref(pkt);
delete pkt;

cout << "total size: " << total_size << endl;
cout << "total duration:" << total_duration << endl;

outdata.close();

//Close the file after reading
avformat_close_input(&s);

}

最佳答案

I can't use it in readable format



你为什么要那个?你想输出你的详细信息 AVPAcket ?然后您需要从您的 AVFormatContext 获取这些详细信息。 . AVPacketstream_index您可以使用它来获取数据包所代表的流的详细信息。另一个有用的信息是数据包的 pts/dts 和大小。
AVPacket pkt = ...;
AVFormatContext *s = ... ;

AVStream* stream = s->streams[pkt.stream_index]; // get the stream

基本上每个媒体文件都包含多个流。打开文件时 AVFormatContext存储有关您打开的文件的信息。 AVFormatContext::streams是作为媒体文件一部分的流(例如音频、视频)。这样从每个 AVPacket你可以得到 AVStream数据包所代表的。在 AVStream你可以检查 codec , duration流和其他有用的参数。

关于c++ - 如何使用 FFMPEG 从编码视频中提取 AVPacket 的重要信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43796421/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com