[Libav-user] I have a question
alejandro ramirez
yealexxx at gmail.com
Sun Jan 27 22:07:58 EET 2019
Hello guys I am working with video. I wan to encrypt the I-frames of one
video compressed in H.264. So I get the AVPacket from the video and compare
if (AVPacket.flags & AV_PKT_FLAG_KEY) to know if the packet has an I frame,
but when I try to print the AVPacket.data I don't have any information to
encrypt. Where can I get the information regarding to I-frame. ahead a put
my code, thank you.
#include <iostream>
extern "C" {
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include <libswscale/swscale.h>
#include <libavutil/avutil.h>
}
#define INBUF_SIZE 4096
//#define AV_INPUT_BUFFER_PADDING_SIZE 32
int main (int argc, char * argv[])
{
//av_register_all();//omit
//revisar el nĂºmero de argumentos en el video
AVFormatContext *pFormatCtx = NULL;
AVCodec *dec = NULL;
AVCodecContext *pCodecCtx = NULL;
AVStream *st = NULL;
AVDictionary *opts = NULL;
AVFrame *frame;
AVPacket avpkt;
uint8_t inbuf [INBUF_SIZE + AV_INPUT_BUFFER_PADDING_SIZE];
FILE *f;
int frame_count;
int video_stream_index = -1;
//av_init_packet (&avpkt);
memset (inbuf + INBUF_SIZE, 0, AV_INPUT_BUFFER_PADDING_SIZE);
if (avformat_open_input (&pFormatCtx, argv[1], NULL, NULL) != 0)
return -1;
if (avformat_find_stream_info (pFormatCtx, NULL) < 0)
return -1;
//video_stream_index = av_find_best_stream
(pFormatCtx,AVMEDIA_TYPE_VIDEO, -1, -1, &dec,0);
video_stream_index = av_find_best_stream
(pFormatCtx,AVMEDIA_TYPE_VIDEO, -1, -1, &dec,0);
if ( video_stream_index < 0)
return -1;
std::cout << "video_stream; " << video_stream_index << "\n";
st = pFormatCtx -> streams [video_stream_index];
std::cout << "number of frames " << st -> nb_frames << "\n";
std::cout << "event_flags " << st -> event_flags << "\n";
//pCodecCtx = st -> codec;//deprecated
dec = avcodec_find_decoder (st -> codecpar -> codec_id);
std::cout << "codec_id: " << st -> codecpar -> codec_id << "\n";
std::cout << "AV_CODEC_ID_H264: " << AV_CODEC_ID_H264 << "\n";
if (!dec)
return -1;
pCodecCtx = avcodec_alloc_context3 (dec);
if (!pCodecCtx)
return -1;
//av_dict_set (&opts, "refcounted_frames", "0", 0);
avcodec_parameters_to_context (pCodecCtx, st -> codecpar);
std::cout << "todo bien \n";
if (avcodec_open2 (pCodecCtx, dec, &opts) < 0)
return -1;
/*************hasta aqui buen
codigo*********************************************/
frame = av_frame_alloc ();
if (!frame)
return -1;
av_init_packet (&avpkt);
avpkt.data = NULL;
avpkt.size = 0;
f = fopen (argv[1], "r");
int times = 1;
while (av_read_frame (pFormatCtx, &avpkt) >= 0){
AVPacket oripkt = avpkt;
if (oripkt.stream_index == video_stream_index){
if (oripkt.flags & AV_PKT_FLAG_KEY){
std::cout << "times: " << times ++ << "\n";
std::cout << "avpkt.flags: " << oripkt.flags << "\n";
std::cout << "tam avpkt.data: " << sizeof(oripkt.data) << "\n";
std::cout << "tam avpkt.data: " << oripkt.data << "\n";
std::cout << "oripkt.size: " << oripkt.size << "\n";
std::cout << "oripkt.side_date_eme: " <<
oripkt.side_data_elems << "\n";
if (!oripkt.data)
std::cout << "no tengo dinero \n";
}
}
}
std::cout << "Fin del programa " << "\n";
}
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://ffmpeg.org/pipermail/libav-user/attachments/20190127/9c40d093/attachment.html>
More information about the Libav-user
mailing list