Ich habe einen Code geschrieben, um ein Video in einer codierten Domäne zu lesen und Informationen wie Größe und Dauer von Frames abzurufen. AVPacket-Klasse besteht aus einer Variablen als Daten. Ich kann es lesen, aber da es ein Biss-Array ist, kann ich es nicht in lesbarem Format verwenden. Ich möchte diese Daten für den Vergleich mit einer anderen Videodatei verwenden. Bitte helfen Sie.So extrahieren Sie wichtige Informationen eines AV-Pakets aus einem codierten Video mit FFMPEG
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);
}
Was ist Ihre Frage? Sie beschreiben Probleme, die Sie haben, aber Sie haben keine Frage in Ihrer Frage ... – tambre
Ich möchte drucken oder verwenden Sie die Informationen in "Daten" -Parameter und verwenden Sie es für Vergleiche und extrahieren nützliche Informationen enthalten. –
Okay. Das willst du machen. Jetzt formuliere eine Frage und füge das zu deiner ... Frage hinzu. – tambre