把例子化简了,功能目前都正常
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
#include "hi_comm_sys.h"
#include "hi_comm_vb.h"
#include "hi_comm_vdec.h"
#include "hi_comm_vpss.h"
#include "hi_comm_vo.h"
#include "hi_comm_hdmi.h"
#include "hi_comm_aio.h"
#include "hi_comm_adec.h"
#include "mpi_sys.h"
#include "mpi_vb.h"
#include "mpi_vdec.h"
#include "mpi_vpss.h"
#include "mpi_vo.h"
#include "mpi_hdmi.h"
#include "mpi_ai.h"
#include "mpi_ao.h"
#include "mpi_adec.h"
#define VO_BKGRD_RED 0xFF0000 /* red back groud color */
#define VO_BKGRD_GREEN 0x00FF00 /* green back groud color */
#define VO_BKGRD_BLUE 0x0000FF /* blue back groud color */
#define VO_BKGRD_BLACK 0x000000 /* black back groud color */
#define VO_BKGRD_YELLOW 0xFFFF00 /* yellow back groud color */
typedef struct tagSAMPLE_ADEC_S
{
HI_BOOL bStart;
HI_S32 AdChn;
FILE *pfd;
pthread_t stAdPid;
} SAMPLE_ADEC_S;
struct Para_Type{
HI_CHAR srcVideoFileName[32]; //要解码的文件名
HI_CHAR srcAudioFileName[32];
HI_U32 u32BufSize; //文件每次读取的大小
HI_U32 u32Width; //视频的宽
HI_U32 u32Height; //视频的高
HI_U32 u32Frmt; //视频的帧率
HI_U32 u32DecChnId; //解码通道号
HI_U32 u32VpssChnId; //视频处理通道号
PAYLOAD_TYPE_E encType; //编码格式H264
VIDEO_MODE_E encMode; //
pthread_t decThread; //解码并发送给VPSS的线程
HI_BOOL bStopThread; //是否停止线程
AUDIO_DEV AoDev; //音频设备
pthread_t audioThread; //音频解码线程
}g_Para;
//SAMPLE_ADEC_S stSampleAdec;
HI_VOID * hi_video_send_to_vdec_thread(HI_VOID *args)
{
FILE *fp=NULL;
HI_U8 *pBuf = NULL;
HI_S32 s32UsedBytes = 0, s32ReadLen, s32Ret;
VDEC_STREAM_S stStream = {
0};
//二进制方式打开h264视频文件
fp = fopen(g_Para.srcVideoFileName, "rb");
pBuf = malloc(g_Para.u32BufSize);
while (1)
{
if(g_Para.bStopThread)
break;
fseek(fp, s32UsedBytes, SEEK_SET);
s32ReadLen = fread(pBuf, 1, g_Para.u32BufSize, fp);
if (s32ReadLen == 0) //文件已经读完,又重头开始读取,实现循环播放的效果
{
s32UsedBytes = 0;
fseek(fp, 0, SEEK_SET); //文件指针的位置归零
s32ReadLen = fread(pBuf, 1, g_Para.u32BufSize, fp);
}
stStream.u64PTS = 0;
stStream.pu8Addr = pBuf;
stStream.u32Len = s32ReadLen;
stStream.bEndOfFrame = HI_FALSE;
stStream.bEndOfStream = HI_FALSE;
s32Ret = HI_MPI_VDEC_SendStream(g_Para.u32DecChnId, &stStream, 0);
if (HI_SUCCESS != s32Ret)
{
sleep(1);
}
else
{
s32UsedBytes += s32ReadLen;
}
usleep(20000);
};
free(pBuf);
fclose(fp);
printf("video thread exit 0\n");
return NULL;
}
void *hi_audio_send_to_adec_thread(void *parg)
{
AUDIO_STREAM_S stAudioStream;
HI_U32 u32Len = 1024;
HI_U32 u32ReadLen;
HI_S32 s32AdecChn = 0;
HI_U8 *pAudioBuf = NULL;
FILE *pfd = fopen(g_Para.srcAudioFileName, "rb");
pAudioBuf = (HI_U8*)malloc(sizeof(HI_U8)*MAX_AUDIO_STREAM_LEN);
while (1)
{
// read from file
if(g_Para.bStopThread)
break;
stAudioStream.pStream = pAudioBuf;
u32ReadLen = fread(stAudioStream.pStream, 1, u32Len, pfd);
if (u32ReadLen <= 0)
{
fseek(pfd, 0, SEEK_SET);//read file again
continue;
}
// here only demo adec streaming sending mode, but pack sending mode is commended
stAudioStream.u32Len = u32ReadLen;
HI_MPI_ADEC_SendStream(s32AdecChn, &stAudioStream, HI_TRUE);
}
free(pAudioBuf);