-
Notifications
You must be signed in to change notification settings - Fork 0
/
MP4Writer.h
131 lines (100 loc) · 2.77 KB
/
MP4Writer.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
#ifndef __MP4_WRITER_H__
#define __MP4_WRITER_H__
#include <vector>
#ifdef __cplusplus
extern "C" {
#endif
#include "gpac/isomedia.h"
#include "gpac/internal/media_dev.h"
#include "gpac/constants.h"
#ifdef __cplusplus
}
#endif
typedef enum _MP4_VIDEO_ENC_TYPE
{
AF_MP4_ENC_NONE = 0,
//video use low 4bits 0x0f
AF_MP4_WITH_VIDEO = 0x01,
AF_MP4_VIDEO_H264 = 0x02,
AF_MP4_VIDEO_H265 = 0x04,
//audio use high 4bits 0xf0
AF_MP4_WITH_AUDIO = 0x10,
AF_MP4_AUDIO_AAC = 0x20,
}MP4_ENC_TYPE;
typedef enum
{
TRACK_NONE = 0,
TRACK_AUDIO = 1,
TRACK_VIDEO = 2
}Media_track_type;
typedef struct
{
Media_track_type track_type;
MP4_ENC_TYPE enc_type;
}Media_track;
typedef enum tag_AF_NALU_TYPE
{
AF_NALU_VPS = 0,
AF_NALU_SPS,
AF_NALU_PPS,
AF_NALU_MAX
}AF_NALU_TYPE;
typedef struct _videoparam
{
int width;
int height;
int fps;
}ParamVideo;
typedef struct _audioparam
{
int samplerate;
int channel;
int bit_depth;
int profile;
}ParamAudio;
class MP4Writer
{
public:
MP4Writer();
virtual ~MP4Writer();
int Create(char *strName);
void AddVideoTrack(MP4_ENC_TYPE nEncType, int nWidth, int nHeight, int nFps = 25);
void AddAudioTrack(MP4_ENC_TYPE nEncType, int samplerate, int channel, int bit_depth, int profile = GF_M4A_AAC_LC);
int WriteVideo(unsigned char *pData, int nSize, uint64_t nTimeStamp);
int WriteAudio(unsigned char *pData, int nSize, uint64_t nTimeStamp);
int Save();
private:
int WriteH264MetaData(unsigned char **ppNaluData, int *pNaluLength);
int WriteH265MetaData(unsigned char **ppNaluData, int *pNaluLength);
int WriteVFrame(unsigned char *pData, int nSize, bool bKey, uint64_t nTimeStamp);
int WriteAFrame(unsigned char *pData, int nSize, uint64_t nTimeStamp);
int WriteH264(unsigned char *pData, int nSize, uint64_t nTimeStamp);
int WriteH265(unsigned char *pData, int nSize, uint64_t nTimeStamp);
int WriteAAC(unsigned char *pData, int nSize, uint64_t nTimeStamp);
int NewVideoTrack();
int NewAudioTrack();
inline void insertMediaTrack(MP4_ENC_TYPE enc_type, Media_track_type track_type);
inline Media_track* getMediaTrack(Media_track_type track_type);
private:
int ConfigAudioTrack(MP4_ENC_TYPE type);
int ConfigAAC();
private:
MP4_ENC_TYPE m_enEncType;
ParamVideo m_vParam;
ParamAudio m_aParam;
uint64_t m_VTimeStamp;
uint64_t m_VLastTimeStamp;
uint64_t m_ATimeStamp;
uint64_t m_ALastTimeStamp;
bool m_VbReady;
bool m_AbReady;
GF_ISOFile *m_pFile;
int32_t m_VnTrackID; //video new track id
int32_t m_AnTrackID; //audio new track id
uint32_t m_VnStreamIndex;
uint32_t m_AnStreamIndex;
uint8_t *m_pNaluData[AF_NALU_MAX];
int32_t m_pNaluLength[AF_NALU_MAX];
std::vector<Media_track> m_media_tracks;
};
#endif