📄 mp4_enc.c
字号:
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <unistd.h>
#include "senddata.h"
#include "basetype.h"
#include "lib/libmp4enc.h"
#include "yuv2yuv.h"
#define IMG_X_SIZE 352
#define IMG_Y_SIZE 288
#define RAW_IMG_SIZE IMG_X_SIZE*IMG_Y_SIZE*3/2 /* YUV4:2:0 */
#define STREAM_BUF_SIZE 100*1024 /* I think it's large enough */
/* Global variables */
unsigned char rawdata[RAW_IMG_SIZE];
unsigned char mp4data[RAW_IMG_SIZE];
int fd_csi2c;
extern int server_sockfd;
float enctime,dectime;
float frame_buf[10] = {0};
int bitrate_buf[10] = {0};
float frame = 0;
int bitrate = 0;
void *pEncInst = NULL;
mp4_encoder_para enc_para;
static double msecond()
{
struct timeval tv;
gettimeofday(&tv, 0);
return (tv.tv_sec * 1.0e3 + tv.tv_usec * 1.0e-3);
}
/************************************************************************/
int main(int argc, char **argv)
{
int save_file;
FILE *fd_mp4 = NULL;
char *filename;
unsigned long coded_bytes;
int stop = 0,ret,i;
if(argc == 1)
save_file = 0;
else
save_file = 1;
if(save_file)
{
filename = argv[1];
if ((fd_mp4 = fopen(filename, "wb")) < 0)
{
printf("File open error !\n");
exit(-1);
}
}
else
/* Initialize socket */
initsock("192.168.1.126",PORT_SOCKET_CLIENT,PORT_SOCKET_SERVER);
/* Open csi device */
if ((fd_csi2c = open("/dev/saa7113_prp", O_RDWR)) < 0)
{
printf("Device csi2c open error !\n");
exit(-1);
}
//fd_mp4 = fopen("test1", "wb");
/* initialize encoder */
pEncInst = wkads_mp4_encoder_init(MP4API_ENC_SCHEME_CIF_15FPS_384KB_PLAIN);
if(pEncInst == 0)
{
printf("Encoder can't be initialized!\n");
return -1;
}
/* configure encoder */
enc_para.i_frame_interval = 100;
enc_para.bitrate = 384; enc_para.rc = 1; enc_para.fps = 15; enc_para.frm_skip = 1; enc_para.rvlc = 0; enc_para.dp = 0; enc_para.qp = 0; enc_para.vp_size = 0; enc_para.cir = 20; enc_para.mode = 0; enc_para.prp = 1; enc_para.mv4 = 1; enc_para.ac_pre = 1;
ret = wkads_mp4_encoder_config(pEncInst,&enc_para);
/* Start mp4 encoder */
coded_bytes = wkads_mp4_encode_start_stream(pEncInst,mp4data);
if(save_file){
//fwrite(&coded_bytes,1,4,fd_mp4);
fwrite(mp4data,1,coded_bytes,fd_mp4);
}
else
senddata(mp4data,coded_bytes);
/* The real action starts */
while(1)
{
/* Read raw YUV4:2:0 data from csi device */
if ((ret = read(fd_csi2c, rawdata, RAW_IMG_SIZE)) < 0)
{
//printf("No available image!\n");
continue;
}
//fwrite(rawdata,1,RAW_IMG_SIZE,fd_mp4);
//return 0;
/* YUV422 -> YUV420 */
//yuv4222yuv420(IMG_X_SIZE,IMG_Y_SIZE/2,rawdata,mp4data);
/* Encoded one frame */
coded_bytes = wkads_mp4_encode(pEncInst,rawdata,mp4data);
/* Write out the encoded stream */
if(save_file){
// fwrite(&coded_bytes,1,4,fd_mp4);
fwrite(mp4data,1,coded_bytes,fd_mp4);
}
else
senddata(mp4data,coded_bytes);
/* Encoder info statistic */
// for(i=9;i>0;i--){
// bitrate_buf[i] = bitrate_buf[i-1];
// }
// bitrate_buf[0] = coded_bytes;
// bitrate = 0;
// for(i=0;i<10;i++){
// bitrate += bitrate_buf[i];
// }
// bitrate *= (15*8);
// bitrate /= 10000;
//
// printf("\nbitrate = %dkb/s\n",bitrate);
printf("One frame is encoded\n");
/* Sorry, it take too much memory space. So kill it */
if(save_file){
stop++;
if(stop == 200)
break;
}
}
/* First flush the stream then destroy it */
coded_bytes = wkads_mp4_encoder_destroy(pEncInst,mp4data);
if(save_file){
//fwrite(&coded_bytes,1,4,fd_mp4);
fwrite(mp4data,1,coded_bytes,fd_mp4);
}
else
senddata(mp4data,coded_bytes);
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -