// // Created by tangchao on 2021/11/16. // #include "ffmpeg_tc.h" char *getsystemtime() { //获取系统时间 time_t timer;//time_t就是long int 类型 struct tm *tblock; timer = time(NULL);//返回秒数(精度为秒),从1970-1-1,00:00:00 可以当成整型输出或用于其它函数 tblock = localtime(&timer); //printf("Local time is: %s\n", asctime(tblock)); //格式化时间为需要的格式 char fileNameTmp[256] = { 0 }; char dirNameTmp[256] = { 0 }; strftime(fileNameTmp, sizeof(fileNameTmp), "%Y%m%d_%H%M%S", tblock); return fileNameTmp; } AVFrame *get_video_frame(IntputDev* input)//tc改动 { clock_t start,finish; start = clock(); // 设置开始clock int ret; AVFrame * ret_frame=NULL; if(av_read_frame(input->v_ifmtCtx, input->in_packet)>=0) { if(input->in_packet->stream_index==input->videoindex) { ret = avcodec_send_packet(input->pCodecCtx, input->in_packet); if (ret < 0) { fprintf(stderr, "Error sending a packet for decoding\n"); exit(1); } ret = avcodec_receive_frame(input->pCodecCtx, input->pFrame); if(ret<0) { printf("Decode Error.\n"); av_packet_unref(input->in_packet); return NULL; } sws_scale(input->img_convert_ctx, (const unsigned char* const*)input->pFrame->data, input->pFrame->linesize, 0, input->pCodecCtx->height, input->pFrameYUV->data, input->pFrameYUV->linesize); input->pFrameYUV->pts=input->next_pts++; ret_frame= input->pFrameYUV; } av_packet_unref(input->in_packet); } finish = clock();// 设置结束clock double duration = (double)(finish - start) / CLOCKS_PER_SEC;//转换浮点型 // printf( "采集视频帧时间:%lf seconds\n", duration ); return ret_frame; } // //static void encode(AVCodecContext *enc_ctx, AVFrame *frame, AVPacket *pkt) //{ // int ret; // // /* send the frame to the encoder */ // if (frame) // printf("Send frame %3"PRId64"\n", frame->pts); // // ret = avcodec_send_frame(enc_ctx, frame);//返回-21????????????????????????????????????????????? // if (ret < 0) { // fprintf(stderr, "Error sending a frame for encoding\n"); // exit(1); // } // // while (ret >= 0) { // ret = avcodec_receive_packet(enc_ctx, pkt); // if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) // return; // else if (ret < 0) { // fprintf(stderr, "Error during encoding\n"); // exit(1); // } // //// printf("Write packet %3"PRId64" (size=%5d)\n", pkt->pts, pkt->size); //// fwrite(pkt->data, 1, pkt->size, outfile); // av_packet_unref(pkt); // } //} void encode(AVCodecContext *enc_ctx, AVFrame *frame, AVPacket *pkt, char **data, int *datasize) { int ret; /* send the frame to the encoder */ // if (frame) // printf("Send frame %3"PRId64"\n", frame->pts); ret = avcodec_send_frame(enc_ctx, frame);//返回-21????????????????????????????????????????????? if (ret < 0) { fprintf(stderr, "Error sending a frame for encoding\n"); exit(1); } while (ret >= 0) { ret = avcodec_receive_packet(enc_ctx, pkt); if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) { printf("11111111111111111111\n"); return; } else if (ret < 0) { fprintf(stderr, "Error during encoding\n"); exit(1); } // printf("Write packet %3"PRId64" (size=%5d)\n", pkt->pts, pkt->size); // fwrite(pkt->data, 1, pkt->size, outfile); //tc char *dataBuffer = calloc(pkt->size, 1); memcpy(dataBuffer,pkt->data,pkt->size); *data = dataBuffer; *datasize = pkt->size; av_packet_unref(pkt); } printf("22222222222222222\n"); } char * encode2(AVCodecContext *enc_ctx, AVFrame *frame, AVPacket *pkt, int *datasize) { clock_t start,finish; start = clock(); // 设置开始clock int ret; char *dataBuffer; ret = avcodec_send_frame(enc_ctx, frame); if (ret < 0) { fprintf(stderr, "Error sending a frame for encoding\n"); exit(1); } while (ret >= 0) { ret = avcodec_receive_packet(enc_ctx, pkt); if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) { printf("11111111111111111111\n"); return NULL; } else if (ret < 0) { fprintf(stderr, "Error during encoding\n"); exit(1); } // printf("Write packet %3"PRId64" (size=%5d)\n", pkt->pts, pkt->size); // fwrite(pkt->data, 1, pkt->size, outfile); //tc dataBuffer = calloc(pkt->size, 1); memcpy(dataBuffer,pkt->data,pkt->size); *datasize = pkt->size; av_packet_unref(pkt); finish = clock();// 设置结束clock double duration = (double)(finish - start) / CLOCKS_PER_SEC;//转换浮点型 // printf( "编码视频帧时间:%lf seconds\n", duration ); return dataBuffer; } }