177 lines
5.1 KiB
C
177 lines
5.1 KiB
C
//
|
||
// 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;
|
||
}
|
||
}
|