推流:代码移植后,运行成功,但是遥控器无法正常显示摄像头画面;

This commit is contained in:
tangchao0503
2023-08-16 17:45:58 +08:00
parent bf32d053a6
commit 5938550032
5 changed files with 782 additions and 31 deletions

View File

@ -0,0 +1,176 @@
//
// 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;
}
}