如何使用FFMPEG从编码的视频中提取AVPACKET的重要信息

How to extract important information of an AVPacket from an encoded video using FFMPEG

本文关键字:AVPACKET 信息 提取 FFMPEG 何使用 编码 的视频      更新时间:2023-10-16

我编写了一个代码,以读取编码域中的视频,并能够检索诸如帧的大小和持续时间之类的信息。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);

}

我不能以可读格式使用它

你为什么要那个?您想输出您的Avpacket的详细信息吗?然后,您需要从AvformatContext获取这些详细信息。AVPacket具有stream_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和其他有用的参数。