嵌入式 hi3518x平台h264+g711a封装mp4代码demo

来源:互联网 发布:淘宝卖袜子是什么类目 编辑:程序博客网 时间:2024/06/06 07:23

先看代码吧,有代码有真相,具体代码的demo(下载demo的朋友请勿在网上上传我的demo,谢谢)下载连接为:

http://download.csdn.net/detail/skdkjxy/8071721

joseph_mp4.tgz

注:代码demo是一个完整的工程,直接进行make x86或者make arm 就可以到目录src下运行可执行文件了。

[cpp] view plain copy 在CODE上查看代码片派生到我的代码片
  1. <span style="font-family:Courier New;font-size:12px;">  
  2. </span>  
[cpp] view plain copy 在CODE上查看代码片派生到我的代码片
  1. <span style="font-family:Courier New;font-size:12px;">#include <fcntl.h>  
  2. #include <stdio.h>  
  3. #include <ctype.h>    
  4. #include <errno.h>  
  5. #include <stdlib.h>  
  6. #include <string.h>  
  7. #include <limits.h>    
  8. #include <unistd.h>  
  9. #include <signal.h>  
  10. #include <dirent.h>  
  11. #include <pthread.h>  
  12.    
  13. #include <asm/types.h>  
  14. #include <arpa/inet.h>  
  15.    
  16. #include <sys/vfs.h>  
  17. #include <sys/time.h>  
  18. #include <sys/wait.h>  
  19. #include <sys/stat.h>   
  20. #include <sys/ioctl.h>  
  21. #include <sys/types.h>  
  22. #include <sys/socket.h>  
  23. #include <sys/utsname.h>   
  24.    
  25. #include <netdb.h>    
  26. #include <net/if.h>  
  27. #include <netinet/in.h>  
  28. #include <net/route.h>  
  29. #include <net/if_arp.h>  
  30.    
  31. #include <linux/fs.h>  
  32. #include <linux/sockios.h>     
  33. #include <linux/netlink.h>  
  34. #include <linux/rtnetlink.h>  
  35.    
  36. #include <netinet/in.h>  
  37. #include <netinet/ip.h>     
  38. #include <netinet/ether.h>  
  39. #include <netinet/ip_icmp.h>    
  40.    
  41. #include "faac.h"  
  42. #include "mp4v2.h"    
  43.    
  44.    
  45. #define  JOSEPH_G711A_LOCATION  "../av_file/test1.g711a"  
  46. #define  JOSEPH_H264_LOCALTION "../av_file/"  
  47. #define  JOSEPH_MP4_FILE   "test.mp4"  
  48.    
  49. #define  MP4_DETAILS_ALL     0xFFFFFFFF  
  50. #define  NALU_SPS  0  
  51. #define  NALU_PPS  1  
  52. #define  NALU_I    2  
  53. #define  NALU_P    3  
  54. #define  NALU_SET  4  
  55.    
  56. typedef unsigned int  uint32_t;  
  57. typedef unsigned char   uint8_t;  
  58.    
  59. typedef struct Joseph_Acc_Config  
  60. {  
  61.     FILE* fpIn;                    //打开的音频文件  
  62.     faacEncHandle hEncoder;        //音频文件描述符  
  63.     unsigned long nSampleRate;     //音频采样数  
  64.     unsigned int nChannels;           //音频声道数  
  65.     unsigned int nPCMBitSize;        //音频采样精度  
  66.     unsigned long nInputSamples;      //每次调用编码时所应接收的原始数据长度  
  67.     unsigned long nMaxOutputBytes;    //每次调用编码时生成的AAC数据的最大长度  
  68.     unsigned char* pbPCMBuffer;       //pcm数据  
  69.     unsigned char* pbAACBuffer;       //aac数据  
  70. }JOSEPH_ACC_CONFIG;  
  71.    
  72. typedef struct Joseph_Mp4_Config  
  73. {  
  74.     FILE* fpInVideo;               //打开的视频文件  
  75.     MP4FileHandle hFile;          //mp4文件描述符  
  76.     MP4TrackId video;              //视频轨道标志符  
  77.     MP4TrackId audio;              //音频轨道标志符  
  78.     int m_vFrameDur;               //帧间隔时间  
  79.     unsigned int timeScale;        //视频每秒的ticks数,如90000  
  80.     unsigned int fps;              //视频帧率  
  81.     unsigned short width;          //视频宽  
  82.     unsigned short height;         //视频高  
  83. }JOSEPH_MP4_CONFIG;  
  84.    
  85. /********************************************************g711a encode decode**********************************************/  
  86. static const int16_t alawtos16[256] =  
  87. {  
  88.      -5504,  -5248,  -6016,  -5760,  -4480,  -4224,  -4992,  -4736,  
  89.      -7552,  -7296,  -8064,  -7808,  -6528,  -6272,  -7040,  -6784,  
  90.      -2752,  -2624,  -3008,  -2880,  -2240,  -2112,  -2496,  -2368,  
  91.      -3776,  -3648,  -4032,  -3904,  -3264,  -3136,  -3520,  -3392,  
  92.     -22016, -20992, -24064, -23040, -17920, -16896, -19968, -18944,  
  93.     -30208, -29184, -32256, -31232, -26112, -25088, -28160, -27136,  
  94.     -11008, -10496, -12032, -11520,  -8960,  -8448,  -9984,  -9472,  
  95.     -15104, -14592, -16128, -15616, -13056, -12544, -14080, -13568,  
  96.       -344,   -328,   -376,   -360,   -280,   -264,   -312,   -296,  
  97.       -472,   -456,   -504,   -488,   -408,   -392,   -440,   -424,  
  98.        -88,    -72,   -120,   -104,    -24,     -8,    -56,    -40,  
  99.       -216,   -200,   -248,   -232,   -152,   -136,   -184,   -168,  
  100.      -1376,  -1312,  -1504,  -1440,  -1120,  -1056,  -1248,  -1184,  
  101.      -1888,  -1824,  -2016,  -1952,  -1632,  -1568,  -1760,  -1696,  
  102.       -688,   -656,   -752,   -720,   -560,   -528,   -624,   -592,  
  103.       -944,   -912,  -1008,   -976,   -816,   -784,   -880,   -848,  
  104.       5504,   5248,   6016,   5760,   4480,   4224,   4992,   4736,  
  105.       7552,   7296,   8064,   7808,   6528,   6272,   7040,   6784,  
  106.       2752,   2624,   3008,   2880,   2240,   2112,   2496,   2368,  
  107.       3776,   3648,   4032,   3904,   3264,   3136,   3520,   3392,  
  108.      22016,  20992,  24064,  23040,  17920,  16896,  19968,  18944,  
  109.      30208,  29184,  32256,  31232,  26112,  25088,  28160,  27136,  
  110.      11008,  10496,  12032,  11520,   8960,   8448,   9984,   9472,  
  111.      15104,  14592,  16128,  15616,  13056,  12544,  14080,  13568,  
  112.        344,    328,    376,    360,    280,    264,    312,    296,  
  113.        472,    456,    504,    488,    408,    392,    440,    424,  
  114.         88,     72,    120,    104,     24,      8,     56,     40,  
  115.        216,    200,    248,    232,    152,    136,    184,    168,  
  116.       1376,   1312,   1504,   1440,   1120,   1056,   1248,   1184,  
  117.       1888,   1824,   2016,   1952,   1632,   1568,   1760,   1696,  
  118.        688,    656,    752,    720,    560,    528,    624,    592,  
  119.        944,    912,   1008,    976,    816,    784,    880,    848  
  120. };  
  121.    
  122. static const int8_t alaw_encode[2049] =  
  123. {  
  124.     0xD5, 0xD4, 0xD7, 0xD6, 0xD1, 0xD0, 0xD3, 0xD2, 0xDD, 0xDC, 0xDF, 0xDE,  
  125.     0xD9, 0xD8, 0xDB, 0xDA, 0xC5, 0xC4, 0xC7, 0xC6, 0xC1, 0xC0, 0xC3, 0xC2,  
  126.     0xCD, 0xCC, 0xCF, 0xCE, 0xC9, 0xC8, 0xCB, 0xCA, 0xF5, 0xF5, 0xF4, 0xF4,  
  127.     0xF7, 0xF7, 0xF6, 0xF6, 0xF1, 0xF1, 0xF0, 0xF0, 0xF3, 0xF3, 0xF2, 0xF2,  
  128.     0xFD, 0xFD, 0xFC, 0xFC, 0xFF, 0xFF, 0xFE, 0xFE, 0xF9, 0xF9, 0xF8, 0xF8,  
  129.     0xFB, 0xFB, 0xFA, 0xFA, 0xE5, 0xE5, 0xE5, 0xE5, 0xE4, 0xE4, 0xE4, 0xE4,  
  130.     0xE7, 0xE7, 0xE7, 0xE7, 0xE6, 0xE6, 0xE6, 0xE6, 0xE1, 0xE1, 0xE1, 0xE1,  
  131.     0xE0, 0xE0, 0xE0, 0xE0, 0xE3, 0xE3, 0xE3, 0xE3, 0xE2, 0xE2, 0xE2, 0xE2,  
  132.     0xED, 0xED, 0xED, 0xED, 0xEC, 0xEC, 0xEC, 0xEC, 0xEF, 0xEF, 0xEF, 0xEF,  
  133.     0xEE, 0xEE, 0xEE, 0xEE, 0xE9, 0xE9, 0xE9, 0xE9, 0xE8, 0xE8, 0xE8, 0xE8,  
  134.     0xEB, 0xEB, 0xEB, 0xEB, 0xEA, 0xEA, 0xEA, 0xEA, 0x95, 0x95, 0x95, 0x95,  
  135.     0x95, 0x95, 0x95, 0x95, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94,  
  136.     0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x96, 0x96, 0x96, 0x96,  
  137.     0x96, 0x96, 0x96, 0x96, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91,  
  138.     0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x93, 0x93, 0x93, 0x93,  
  139.     0x93, 0x93, 0x93, 0x93, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92,  
  140.     0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9C, 0x9C, 0x9C, 0x9C,  
  141.     0x9C, 0x9C, 0x9C, 0x9C, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F,  
  142.     0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x9E, 0x99, 0x99, 0x99, 0x99,  
  143.     0x99, 0x99, 0x99, 0x99, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98,  
  144.     0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9B, 0x9A, 0x9A, 0x9A, 0x9A,  
  145.     0x9A, 0x9A, 0x9A, 0x9A, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85,  
  146.     0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x84, 0x84, 0x84, 0x84,  
  147.     0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84,  
  148.     0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87,  
  149.     0x87, 0x87, 0x87, 0x87, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86,  
  150.     0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x81, 0x81, 0x81, 0x81,  
  151.     0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81,  
  152.     0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  
  153.     0x80, 0x80, 0x80, 0x80, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83,  
  154.     0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x82, 0x82, 0x82, 0x82,  
  155.     0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82,  
  156.     0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D, 0x8D,  
  157.     0x8D, 0x8D, 0x8D, 0x8D, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C,  
  158.     0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8F, 0x8F, 0x8F, 0x8F,  
  159.     0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F, 0x8F,  
  160.     0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E, 0x8E,  
  161.     0x8E, 0x8E, 0x8E, 0x8E, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89,  
  162.     0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x88, 0x88, 0x88, 0x88,  
  163.     0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,  
  164.     0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B, 0x8B,  
  165.     0x8B, 0x8B, 0x8B, 0x8B, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A,  
  166.     0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0x8A, 0xB5, 0xB5, 0xB5, 0xB5,  
  167.     0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5,  
  168.     0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5,  
  169.     0xB5, 0xB5, 0xB5, 0xB5, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4,  
  170.     0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4,  
  171.     0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4,  
  172.     0xB7, 0xB7, 0xB7, 0xB7, 0xB7, 0xB7, 0xB7, 0xB7, 0xB7, 0xB7, 0xB7, 0xB7,  
  173.     0xB7, 0xB7, 0xB7, 0xB7, 0xB7, 0xB7, 0xB7, 0xB7, 0xB7, 0xB7, 0xB7, 0xB7,  
  174.     0xB7, 0xB7, 0xB7, 0xB7, 0xB7, 0xB7, 0xB7, 0xB7, 0xB6, 0xB6, 0xB6, 0xB6,  
  175.     0xB6, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6,  
  176.     0xB6, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6,  
  177.     0xB6, 0xB6, 0xB6, 0xB6, 0xB1, 0xB1, 0xB1, 0xB1, 0xB1, 0xB1, 0xB1, 0xB1,  
  178.     0xB1, 0xB1, 0xB1, 0xB1, 0xB1, 0xB1, 0xB1, 0xB1, 0xB1, 0xB1, 0xB1, 0xB1,  
  179.     0xB1, 0xB1, 0xB1, 0xB1, 0xB1, 0xB1, 0xB1, 0xB1, 0xB1, 0xB1, 0xB1, 0xB1,  
  180.     0xB0, 0xB0, 0xB0, 0xB0, 0xB0, 0xB0, 0xB0, 0xB0, 0xB0, 0xB0, 0xB0, 0xB0,  
  181.     0xB0, 0xB0, 0xB0, 0xB0, 0xB0, 0xB0, 0xB0, 0xB0, 0xB0, 0xB0, 0xB0, 0xB0,  
  182.     0xB0, 0xB0, 0xB0, 0xB0, 0xB0, 0xB0, 0xB0, 0xB0, 0xB3, 0xB3, 0xB3, 0xB3,  
  183.     0xB3, 0xB3, 0xB3, 0xB3, 0xB3, 0xB3, 0xB3, 0xB3, 0xB3, 0xB3, 0xB3, 0xB3,  
  184.     0xB3, 0xB3, 0xB3, 0xB3, 0xB3, 0xB3, 0xB3, 0xB3, 0xB3, 0xB3, 0xB3, 0xB3,  
  185.     0xB3, 0xB3, 0xB3, 0xB3, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2,  
  186.     0xB2, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2,  
  187.     0xB2, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2,  
  188.     0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD,  
  189.     0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD,  
  190.     0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBC, 0xBC, 0xBC, 0xBC,  
  191.     0xBC, 0xBC, 0xBC, 0xBC, 0xBC, 0xBC, 0xBC, 0xBC, 0xBC, 0xBC, 0xBC, 0xBC,  
  192.     0xBC, 0xBC, 0xBC, 0xBC, 0xBC, 0xBC, 0xBC, 0xBC, 0xBC, 0xBC, 0xBC, 0xBC,  
  193.     0xBC, 0xBC, 0xBC, 0xBC, 0xBF, 0xBF, 0xBF, 0xBF, 0xBF, 0xBF, 0xBF, 0xBF,  
  194.     0xBF, 0xBF, 0xBF, 0xBF, 0xBF, 0xBF, 0xBF, 0xBF, 0xBF, 0xBF, 0xBF, 0xBF,  
  195.     0xBF, 0xBF, 0xBF, 0xBF, 0xBF, 0xBF, 0xBF, 0xBF, 0xBF, 0xBF, 0xBF, 0xBF,  
  196.     0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE,  
  197.     0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE,  
  198.     0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xBE, 0xB9, 0xB9, 0xB9, 0xB9,  
  199.     0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0xB9,  
  200.     0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0xB9,  
  201.     0xB9, 0xB9, 0xB9, 0xB9, 0xB8, 0xB8, 0xB8, 0xB8, 0xB8, 0xB8, 0xB8, 0xB8,  
  202.     0xB8, 0xB8, 0xB8, 0xB8, 0xB8, 0xB8, 0xB8, 0xB8, 0xB8, 0xB8, 0xB8, 0xB8,  
  203.     0xB8, 0xB8, 0xB8, 0xB8, 0xB8, 0xB8, 0xB8, 0xB8, 0xB8, 0xB8, 0xB8, 0xB8,  
  204.     0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB,  
  205.     0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB,  
  206.     0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBA, 0xBA, 0xBA, 0xBA,  
  207.     0xBA, 0xBA, 0xBA, 0xBA, 0xBA, 0xBA, 0xBA, 0xBA, 0xBA, 0xBA, 0xBA, 0xBA,  
  208.     0xBA, 0xBA, 0xBA, 0xBA, 0xBA, 0xBA, 0xBA, 0xBA, 0xBA, 0xBA, 0xBA, 0xBA,  
  209.     0xBA, 0xBA, 0xBA, 0xBA, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5,  
  210.     0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5,  
  211.     0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5,  
  212.     0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5,  
  213.     0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5,  
  214.     0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA4, 0xA4, 0xA4, 0xA4,  
  215.     0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4,  
  216.     0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4,  
  217.     0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4,  
  218.     0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4,  
  219.     0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4,  
  220.     0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7,  
  221.     0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7,  
  222.     0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7,  
  223.     0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7,  
  224.     0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7, 0xA7,  
  225.     0xA7, 0xA7, 0xA7, 0xA7, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6,  
  226.     0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6,  
  227.     0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6,  
  228.     0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6,  
  229.     0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6,  
  230.     0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA1, 0xA1, 0xA1, 0xA1,  
  231.     0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1,  
  232.     0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1,  
  233.     0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1,  
  234.     0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1,  
  235.     0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1, 0xA1,  
  236.     0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0,  
  237.     0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0,  
  238.     0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0,  
  239.     0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0,  
  240.     0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0,  
  241.     0xA0, 0xA0, 0xA0, 0xA0, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3,  
  242.     0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3,  
  243.     0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3,  
  244.     0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3,  
  245.     0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3,  
  246.     0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA2, 0xA2, 0xA2, 0xA2,  
  247.     0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2,  
  248.     0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2,  
  249.     0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2,  
  250.     0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2,  
  251.     0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2, 0xA2,  
  252.     0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD,  
  253.     0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD,  
  254.     0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD,  
  255.     0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD,  
  256.     0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD, 0xAD,  
  257.     0xAD, 0xAD, 0xAD, 0xAD, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC,  
  258.     0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC,  
  259.     0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC,  
  260.     0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC,  
  261.     0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC,  
  262.     0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAC, 0xAF, 0xAF, 0xAF, 0xAF,  
  263.     0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF,  
  264.     0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF,  
  265.     0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF,  
  266.     0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF,  
  267.     0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF,  
  268.     0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE,  
  269.     0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE,  
  270.     0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE,  
  271.     0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE,  
  272.     0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE, 0xAE,  
  273.     0xAE, 0xAE, 0xAE, 0xAE, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9,  
  274.     0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9,  
  275.     0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9,  
  276.     0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9,  
  277.     0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9,  
  278.     0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA9, 0xA8, 0xA8, 0xA8, 0xA8,  
  279.     0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8,  
  280.     0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8,  
  281.     0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8,  
  282.     0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8,  
  283.     0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8,  
  284.     0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB,  
  285.     0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB,  
  286.     0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB,  
  287.     0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB,  
  288.     0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB, 0xAB,  
  289.     0xAB, 0xAB, 0xAB, 0xAB, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,  
  290.     0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,  
  291.     0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,  
  292.     0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,  
  293.     0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,  
  294.     0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0x2A  
  295. };   
  296.    
  297. int g711a_decode(void *pout_buf, int *pout_len, const void *pin_buf, const int  in_len)  
  298. {  
  299.     int16_t *dst = (int16_t *)pout_buf;  
  300.     uint8_t *src = (uint8_t *)pin_buf;  
  301.     uint32_t i = 0;  
  302.     int Ret = 0;  
  303.        
  304.     if ( (NULL == pout_buf)  
  305.         || (NULL == pout_len)  
  306.         || (NULL == pin_buf)  
  307.         || (0 == in_len) )  
  308.     {  
  309.         return -1;  
  310.     }  
  311.        
  312.     if ( *pout_len < 2 * in_len )  
  313.     {  
  314.         return -2;  
  315.     }  
  316.        
  317.     for( i = 0; i < in_len; i++ )  
  318.     {  
  319.         *(dst++) = alawtos16[*(src++)];  
  320.     }  
  321.        
  322.     Ret = 2 * in_len;  
  323.        
  324.     return Ret;  
  325. }  
  326.    
  327. int g711a_encode(void *pout_buf, int *pout_len, const void *pin_buf, const int in_len)  
  328. {  
  329.     int8_t *dst = (int8_t *)pout_buf;  
  330.     int16_t *src = (int16_t *)pin_buf;  
  331.     uint32_t i = 0;  
  332.     int Ret = 0;  
  333.        
  334.     if ( (NULL == pout_buf)  
  335.         || (NULL == pout_len)  
  336.         || (NULL == pin_buf)  
  337.         || (0 == in_len) )  
  338.     {  
  339.         return -1;  
  340.     }  
  341.        
  342.     if ( *pout_len < in_len / 2 )  
  343.     {  
  344.         return -2;  
  345.     }  
  346.        
  347.     for( i = 0; i < in_len / 2; i++ )  
  348.     {  
  349.         int16_t s = *(src++);  
  350.         if( s >= 0)  
  351.         {  
  352.             *(dst++) = alaw_encode[s / 16];  
  353.         }  
  354.         else  
  355.         {  
  356.             *(dst++) = 0x7F & alaw_encode[s / -16];  
  357.         }  
  358.     }  
  359.        
  360.     Ret = in_len / 2;  
  361.        
  362.     return Ret;  
  363. }  
  364.    
  365. int joseph_get_g711a_frame(JOSEPH_MP4_CONFIG* joseph_mp4_config, unsigned char *nVideoBuffer, int nVideoRet)  
  366. {         
  367.     int nVideoSize = 0;  
  368.     char nVideoNum[32] = {0};  
  369.     memset(nVideoNum, 0, 32);  
  370.     sprintf(nVideoNum, "%s%d", JOSEPH_H264_LOCALTION, nVideoRet);  
  371.     joseph_mp4_config->fpInVideo = fopen(nVideoNum, "rb");  
  372.     memset(nVideoBuffer, 0, 1048576);  
  373.     nVideoSize = fread(nVideoBuffer, 1, 1048576, joseph_mp4_config->fpInVideo);  
  374.    
  375.     fclose(joseph_mp4_config->fpInVideo);  
  376.        
  377.     return nVideoSize;  
  378. }  
  379.    
  380. /***********************************************************mp4 encode***********************************************/  
  381. JOSEPH_MP4_CONFIG* InitMp4Encoder(JOSEPH_ACC_CONFIG* joseph_aac_config)  
  382. {  
  383.     JOSEPH_MP4_CONFIG *joseph_mp4_config = NULL;  
  384.     joseph_mp4_config =(JOSEPH_MP4_CONFIG *)malloc(sizeof(JOSEPH_MP4_CONFIG));  
  385.        
  386.     joseph_mp4_config->m_vFrameDur = 0;  
  387.     joseph_mp4_config->video = MP4_INVALID_TRACK_ID;   
  388.     joseph_mp4_config->audio = MP4_INVALID_TRACK_ID;  
  389.     joseph_mp4_config->hFile = NULL;  
  390.     joseph_mp4_config->timeScale = 90000;      
  391.     joseph_mp4_config->fps = 25;                
  392.     joseph_mp4_config->width = 640;            
  393.     joseph_mp4_config->height = 480;   
  394.        
  395.     /*file handle*/  
  396.     joseph_mp4_config->hFile = MP4Create(JOSEPH_MP4_FILE, 0);  
  397.     if(joseph_mp4_config->hFile == MP4_INVALID_FILE_HANDLE)  
  398.     {  
  399.         printf("open file fialed.\n");  
  400.         return NULL;  
  401.     }  
  402.     MP4SetTimeScale(joseph_mp4_config->hFile, joseph_mp4_config->timeScale);    //timeScale  
  403.        
  404.     /*audio track*/  
  405.     joseph_mp4_config->audio = MP4AddAudioTrack(joseph_mp4_config->hFile, joseph_aac_config->nSampleRate, \  
  406.                                                     joseph_aac_config->nInputSamples, MP4_MPEG4_AUDIO_TYPE);  
  407.     if(joseph_mp4_config->audio == MP4_INVALID_TRACK_ID)  
  408.     {  
  409.         printf("add audio track failed.\n");  
  410.         return NULL;  
  411.     }  
  412.        
  413.     MP4SetAudioProfileLevel(joseph_mp4_config->hFile, 0x2);  
  414.     unsigned char aacConfig[2] = {0x15, 0x88};                                               // 0001 0101 1000 1000  
  415.     MP4SetTrackESConfiguration(joseph_mp4_config->hFile, joseph_mp4_config->audio, aacConfig, 2);  
  416.        
  417.     return joseph_mp4_config;  
  418. }  
  419.    
  420. //------------------------------------------------------------------------------------------------- Mp4Encode说明  
  421. // 【h264编码出的NALU规律】  
  422. // 第一帧 SPS【0 0 0 1 0x67】 PPS【0 0 0 1 0x68】 SEI【0 0 0 1 0x6】 IDR【0 0 0 1 0x65】  
  423. // p帧      P【0 0 0 1 0x61】  
  424. // I帧    SPS【0 0 0 1 0x67】 PPS【0 0 0 1 0x68】 IDR【0 0 0 1 0x65】  
  425. // 【mp4v2封装函数MP4WriteSample】  
  426. // 此函数接收I/P nalu,该nalu需要用4字节的数据大小头替换原有的起始头,并且数据大小为big-endian格式  
  427. //-------------------------------------------------------------------------------------------------  
  428. int Mp4VEncode(JOSEPH_MP4_CONFIG* joseph_mp4_config, unsigned char* naluData, int naluSize)  
  429. {  
  430.     int index = -1;  
  431.        
  432.     if(naluData[0]==0 && naluData[1]==0 && naluData[2]==0 && naluData[3]==1 && naluData[4]==0x67)  
  433.     {  
  434.         index = NALU_SPS;  
  435.         printf("%s[%d]====NALU_SPS\n",__FUNCTION__,__LINE__);  
  436.     }  
  437.     if(index!=NALU_SPS && joseph_mp4_config->video == MP4_INVALID_TRACK_ID)  
  438.     {  
  439.         return -1;  
  440.     }  
  441.     if(naluData[0]==0 && naluData[1]==0 && naluData[2]==0 && naluData[3]==1 && naluData[4]==0x68)  
  442.     {  
  443.         index = NALU_PPS;  
  444.         printf("%s[%d]====NALU_PPS\n",__FUNCTION__,__LINE__);  
  445.     }  
  446.     if(naluData[0]==0 && naluData[1]==0 && naluData[2]==0 && naluData[3]==1 && naluData[4]==0x65)  
  447.     {  
  448.         index = NALU_I;  
  449.         printf("%s[%d]====NALU_I\n",__FUNCTION__,__LINE__);  
  450.     }  
  451.     if(naluData[0]==0 && naluData[1]==0 && naluData[2]==0 && naluData[3]==1 && naluData[4]==0x61)  
  452.     {  
  453.         index = NALU_P;  
  454.         printf("%s[%d]====NALU_P\n",__FUNCTION__,__LINE__);  
  455.     }  
  456.     if(naluData[0]==0 && naluData[1]==0 && naluData[2]==0 && naluData[3]==1 && naluData[4]==0x6)  
  457.     {  
  458.         index = NALU_SET;  
  459.         printf("%s[%d]====NALU_SET\n",__FUNCTION__,__LINE__);  
  460.     }  
  461.        
  462.     switch(index)  
  463.     {  
  464.         case NALU_SPS:           
  465.             if(joseph_mp4_config->video == MP4_INVALID_TRACK_ID)  
  466.             {  
  467.                 joseph_mp4_config->video = MP4AddH264VideoTrack    
  468.                     (joseph_mp4_config->hFile,     
  469.                     joseph_mp4_config->timeScale,                               //timeScale  
  470.                     (joseph_mp4_config->timeScale / joseph_mp4_config->fps),    //sampleDuration    timeScale/fps  
  471.                     joseph_mp4_config->width,                                    // width    
  472.                     joseph_mp4_config->height,                                   // height    
  473.                     naluData[5],                                                // sps[1] AVCProfileIndication    
  474.                     naluData[6],                                                // sps[2] profile_compat    
  475.                     naluData[7],                                                // sps[3] AVCLevelIndication    
  476.                     3);                                                         // 4 bytes length before each NAL unit    
  477.                 if(joseph_mp4_config->video == MP4_INVALID_TRACK_ID)  
  478.                 {  
  479.                     printf("add video track failed.\n");  
  480.                     return -1;  
  481.                 }  
  482.                 //MP4SetVideoProfileLevel(joseph_mp4_config->hFile, 1); //  Simple Profile @ Level 3   mp4编码标准  
  483.                 MP4SetVideoProfileLevel(joseph_mp4_config->hFile, 0x7F); //  Simple Profile @ Level 3  
  484.             }    
  485.             MP4AddH264SequenceParameterSet(joseph_mp4_config->hFile, joseph_mp4_config->video, naluData+4, naluSize-4);    
  486.             break;  
  487.         case NALU_PPS:    
  488.             MP4AddH264PictureParameterSet(joseph_mp4_config->hFile, joseph_mp4_config->video, naluData+4, naluSize-4);    
  489.             break;  
  490.         case NALU_SET:    
  491.             MP4AddH264PictureParameterSet(joseph_mp4_config->hFile, joseph_mp4_config->video, naluData+4, naluSize-4);    
  492.             break;  
  493.         case NALU_I:   
  494.             {  
  495.                 unsigned char* IFrameData = (unsigned char*)malloc((naluSize)* sizeof(unsigned char));  
  496.                    
  497.                 IFrameData[0] = (naluSize-4) >>24;    
  498.                 IFrameData[1] = (naluSize-4) >>16;    
  499.                 IFrameData[2] = (naluSize-4) >>8;    
  500.                 IFrameData[3] = (naluSize-4) &0xff;    
  501.                    
  502.                 memcpy(IFrameData+4, naluData+4, naluSize-4);  
  503.                 //if(!MP4WriteSample(joseph_mp4_config->hFile, joseph_mp4_config->video, IFrameData, naluSize+1, m_vFrameDur/8000*90000, 0, 1))  
  504.                 if(!MP4WriteSample(joseph_mp4_config->hFile, joseph_mp4_config->video, IFrameData, naluSize, MP4_INVALID_DURATION, 0, 1))  
  505.                 {    
  506.                     return -1;    
  507.                 }    
  508.                    
  509.                 //joseph_mp4_config->m_vFrameDur = 0;  
  510.                 free(IFrameData);   
  511.                 IFrameData = NULL;  
  512.                    
  513.                 break;  
  514.             }  
  515.         case NALU_P:  
  516.             {  
  517.                 naluData[0] = (naluSize-4) >>24;    
  518.                 naluData[1] = (naluSize-4) >>16;    
  519.                 naluData[2] = (naluSize-4) >>8;    
  520.                 naluData[3] = (naluSize-4) &0xff;   
  521.                    
  522.                 //if(!MP4WriteSample(joseph_mp4_config->hFile, joseph_mp4_config->video, naluData, naluSize, m_vFrameDur/8000*90000, 0, 1))  
  523.                 if(!MP4WriteSample(joseph_mp4_config->hFile, joseph_mp4_config->video, naluData, naluSize, MP4_INVALID_DURATION, 0, 1))  
  524.                 {    
  525.                     return -1;    
  526.                 }  
  527.                    
  528.                 //joseph_mp4_config->m_vFrameDur = 0;  
  529.                    
  530.                 break;  
  531.             }  
  532.         default:  
  533.             break;  
  534.     }  
  535.            
  536.     return 0;  
  537. }  
  538.    
  539. int Mp4AEncode(JOSEPH_MP4_CONFIG* joseph_mp4_config, unsigned char* aacData, int aacSize)  
  540. {  
  541.     if(joseph_mp4_config->video == MP4_INVALID_TRACK_ID)  
  542.     {  
  543.         return -1;  
  544.     }  
  545.     MP4WriteSample(joseph_mp4_config->hFile, joseph_mp4_config->audio, aacData, aacSize , MP4_INVALID_DURATION, 0, 1);  
  546.        
  547.     //joseph_mp4_config->m_vFrameDur += 1024;  
  548.        
  549.     return 0;  
  550. }  
  551.    
  552. void CloseMp4Encoder(JOSEPH_MP4_CONFIG* joseph_mp4_config)  
  553. {  
  554.     if(joseph_mp4_config->hFile)  
  555.     {    
  556.         MP4Close(joseph_mp4_config->hFile, 0);    
  557.         joseph_mp4_config->hFile = NULL;    
  558.     }  
  559.        
  560.     return ;  
  561. }  
  562. /*************************************************aac encode******************************************/  
  563. JOSEPH_ACC_CONFIG* InitAccEncoder(void)  
  564. {  
  565.     JOSEPH_ACC_CONFIG* joseph_aac_config = NULL;  
  566.        
  567.     faacEncConfigurationPtr pConfiguration;  
  568.        
  569.     int nRet = 0;  
  570.     int nPCMBufferSize = 0;  
  571.        
  572.     joseph_aac_config = (JOSEPH_ACC_CONFIG*)malloc(sizeof(JOSEPH_ACC_CONFIG));  
  573.        
  574.     joseph_aac_config->nSampleRate = 8000;  
  575.     joseph_aac_config->nChannels = 1;  
  576.     joseph_aac_config->nPCMBitSize = 16;  
  577.     joseph_aac_config->nInputSamples = 0;  
  578.     joseph_aac_config->nMaxOutputBytes = 0;  
  579.        
  580.     joseph_aac_config->fpIn = fopen(JOSEPH_G711A_LOCATION, "rb");  
  581.        
  582.     //open FAAC engine  
  583.     joseph_aac_config->hEncoder = faacEncOpen(joseph_aac_config->nSampleRate, joseph_aac_config->nChannels, \  
  584.                                 &joseph_aac_config->nInputSamples, &joseph_aac_config->nMaxOutputBytes);  
  585.     if(joseph_aac_config->hEncoder == NULL)  
  586.     {  
  587.         printf("failed to call faacEncOpen()\n");  
  588.         return NULL;  
  589.     }  
  590.        
  591.     nPCMBufferSize = (joseph_aac_config->nInputSamples*(joseph_aac_config->nPCMBitSize/8));  
  592.     joseph_aac_config->pbPCMBuffer=(unsigned char*)malloc(nPCMBufferSize*sizeof(unsigned char));  
  593.     memset(joseph_aac_config->pbPCMBuffer, 0, nPCMBufferSize);  
  594.     joseph_aac_config->pbAACBuffer=(unsigned char*)malloc(joseph_aac_config->nMaxOutputBytes*sizeof(unsigned char));  
  595.     memset(joseph_aac_config->pbAACBuffer, 0, joseph_aac_config->nMaxOutputBytes);  
  596.        
  597.     //GET current encoding configuration  
  598.     pConfiguration = faacEncGetCurrentConfiguration(joseph_aac_config->hEncoder);  
  599. #if 1  
  600.     pConfiguration->inputFormat = FAAC_INPUT_16BIT;  
  601.     pConfiguration->outputFormat = 0;  
  602.         pConfiguration->aacObjectType = LOW;  
  603. #else  
  604.     pConfiguration->inputFormat = FAAC_INPUT_16BIT;  
  605.    
  606.     /*0 - raw; 1 - ADTS*/  
  607.     pConfiguration->outputFormat = 0;  
  608.     pConfiguration->useTns = 0;  
  609.     pConfiguration->allowMidside = 1;  
  610.     pConfiguration->shortctl = SHORTCTL_NORMAL;  
  611.     pConfiguration->aacObjectType = LOW;  
  612.     pConfiguration->mpegVersion = MPEG2;  
  613. #endif    
  614.     //set encoding configuretion  
  615.     nRet = faacEncSetConfiguration(joseph_aac_config->hEncoder, pConfiguration);  
  616.        
  617.     return joseph_aac_config;  
  618. }  
  619. void CloseAccEncoder(JOSEPH_ACC_CONFIG* joseph_aac_config)  
  620. {  
  621.     if(joseph_aac_config->hEncoder)  
  622.     {    
  623.         faacEncClose(joseph_aac_config->hEncoder);    
  624.         joseph_aac_config->hEncoder = NULL;    
  625.     }  
  626.        
  627.     return ;  
  628. }  
  629. /*********************************************main**************************************************/  
  630. int main(int argc, char* argv[])  
  631. {     
  632.     JOSEPH_ACC_CONFIG *joseph_aac_config = NULL;  
  633.     JOSEPH_MP4_CONFIG *joseph_mp4_config = NULL;  
  634.        
  635.     int nRet = 0;  
  636.     int nTmp = 0;  
  637.     int nCount = 0;  
  638.     int nStatus = 0;  
  639.     int PCMSize = 320;  
  640.     int nPCMRead = 0;  
  641.     int nVideoRet = 0;    
  642.     int gBytesRead = 0;  
  643.     int nVideoSize = 0;  
  644.     int nPCMBufferSize = 0;  
  645.        
  646.     unsigned char nVideoBuffer[1048576] = {0};  
  647.        
  648.     unsigned char *pPCM = NULL;  
  649.     unsigned char *pbG711ABuffer = NULL;  
  650.     unsigned char *pbPCMTmpBuffer = NULL;  
  651.        
  652.     pbG711ABuffer = (unsigned char *)malloc(164 *sizeof(unsigned char));  
  653.     memset(pbG711ABuffer, 0, 164);    
  654.     pbPCMTmpBuffer = (unsigned char *)malloc(PCMSize *sizeof(unsigned char));  
  655.     memset(pbPCMTmpBuffer, 0, PCMSize);  
  656.                    
  657.     /*init aac */  
  658.     if((joseph_aac_config=InitAccEncoder()) == NULL)  
  659.     {  
  660.         printf("init aac failed\n");  
  661.         return -1;  
  662.     }  
  663.        
  664.     /*init mp4*/  
  665.     if((joseph_mp4_config=InitMp4Encoder(joseph_aac_config)) == NULL)  
  666.     {  
  667.         printf("init mp4 failed\n");  
  668.         return -1;  
  669.     }     
  670.        
  671.     nPCMBufferSize = (joseph_aac_config->nInputSamples*(joseph_aac_config->nPCMBitSize/8));  
  672.        
  673.     /*write video audio frame*/  
  674.     while(((gBytesRead = fread(pbG711ABuffer, 1, 164, joseph_aac_config->fpIn)) >0) && (nVideoRet < 312))  
  675.     {  
  676.         nStatus = 0;  
  677.            
  678.         /*hisi audio the first 4 bytes is error*/  
  679.         pPCM = pbG711ABuffer + 4;  
  680.         memset(pbPCMTmpBuffer, 0, PCMSize);  
  681.         memset(joseph_aac_config->pbAACBuffer, 0, joseph_aac_config->nMaxOutputBytes);  
  682.            
  683.         /*g711 to pcm*/  
  684.         if((nPCMRead = g711a_decode(pbPCMTmpBuffer,  &PCMSize,  pPCM,  gBytesRead-4)) < 0)  
  685.         {  
  686.             printf(" G711A -> PCM  fail\n");  
  687.             break;  
  688.         }  
  689.            
  690.         /*pcm to aac*/  
  691.         if((nPCMBufferSize - nCount) < nPCMRead)  
  692.         {  
  693.    
  694.             nStatus = 1;  
  695.             memcpy((joseph_aac_config->pbPCMBuffer + nCount), pbPCMTmpBuffer, (nPCMBufferSize - nCount));  
  696.             joseph_aac_config->nInputSamples = (nPCMBufferSize / (joseph_aac_config->nPCMBitSize / 8));  
  697.             nRet = faacEncEncode(joseph_aac_config->hEncoder, (int*) (joseph_aac_config->pbPCMBuffer), \  
  698.                                     joseph_aac_config->nInputSamples, joseph_aac_config->pbAACBuffer, joseph_aac_config->nMaxOutputBytes);  
  699.    
  700. #if 1                                 
  701.             /*get video frame*/  
  702.             nVideoSize = joseph_get_g711a_frame(joseph_mp4_config, nVideoBuffer, nVideoRet);  
  703.             if(nVideoSize < 0)  
  704.             {  
  705.                 printf("read g711a frame failed\n");  
  706.                 break;  
  707.             }  
  708.             nVideoRet++;  
  709.                
  710.             /*write video frame to mp4*/  
  711.             if((Mp4VEncode(joseph_mp4_config, nVideoBuffer, nVideoSize)) < 0)  
  712.             {  
  713.                 printf("write video frame failed\n");  
  714.                 break;  
  715.             }  
  716. #endif  
  717. #if 1                         
  718.             /*write audio frame to mp4*/  
  719.             if((Mp4AEncode(joseph_mp4_config, joseph_aac_config->pbAACBuffer, nRet)) < 0)  
  720.             {  
  721.                 printf("write audio frame failed\n");  
  722.                 break;  
  723.             }  
  724. #endif            
  725.             /*Treatment of redundant frames*/  
  726.             nTmp = (nPCMRead - (nPCMBufferSize - nCount));  
  727.             memset(joseph_aac_config->pbPCMBuffer, 0, nPCMBufferSize);  
  728.             memcpy(joseph_aac_config->pbPCMBuffer, (pbPCMTmpBuffer + (nPCMBufferSize-nCount)), nTmp);  
  729.             nCount = 0;  
  730.             nCount += nTmp;  
  731.                
  732.         }  
  733.         if( nStatus == 0)  
  734.         {  
  735.             memcpy(joseph_aac_config->pbPCMBuffer + nCount, pbPCMTmpBuffer, nPCMRead);  
  736.             nCount += nPCMRead;  
  737.         }  
  738.         if(nPCMRead < 320)  
  739.         {  
  740.             joseph_aac_config->nInputSamples = (nCount / (joseph_aac_config->nPCMBitSize / 8));  
  741.             nRet = faacEncEncode(joseph_aac_config->hEncoder, (int*) (joseph_aac_config->pbPCMBuffer), \  
  742.                                     joseph_aac_config->nInputSamples, joseph_aac_config->pbAACBuffer, joseph_aac_config->nMaxOutputBytes);  
  743. #if 1             
  744.             /*get video frame*/  
  745.             nVideoSize = joseph_get_g711a_frame(joseph_mp4_config, nVideoBuffer, nVideoRet);  
  746.             if(nVideoSize < 0)  
  747.             {  
  748.                 printf("read g711a frame failed\n");  
  749.                 break;  
  750.             }  
  751.             nVideoRet++;  
  752.                
  753.             /*write video frame to mp4*/  
  754.             if((Mp4VEncode(joseph_mp4_config, nVideoBuffer, nVideoSize)) < 0)  
  755.             {  
  756.                 printf("write video frame failed\n");  
  757.                 break;  
  758.             }  
  759. #endif  
  760. #if 1  
  761.             /*write audio frame to mp4*/  
  762.             if((Mp4AEncode(joseph_mp4_config, joseph_aac_config->pbAACBuffer, nRet)) < 0)  
  763.             {  
  764.                 printf("write audio frame failed\n");  
  765.                 break;  
  766.             }  
  767. #endif            
  768.         }  
  769.            
  770.         memset(pbG711ABuffer, 0, 164);    
  771.     }  
  772.        
  773.     /*Close FAAC engine*/  
  774.     CloseAccEncoder(joseph_aac_config);  
  775.     CloseMp4Encoder(joseph_mp4_config);  
  776.        
  777.     /*close file fp*/  
  778.     fclose(joseph_aac_config->fpIn);  
  779.        
  780.     /*free the source of malloc*/  
  781.     //audio part  
  782.     free(joseph_aac_config->pbPCMBuffer);  
  783.     joseph_aac_config->pbPCMBuffer = NULL;  
  784.     free(joseph_aac_config->pbAACBuffer);  
  785.     joseph_aac_config->pbAACBuffer = NULL;  
  786.     free(pbG711ABuffer);  
  787.     pbG711ABuffer = NULL;  
  788.     free(pbPCMTmpBuffer);  
  789.     pbPCMTmpBuffer = NULL;  
  790.     free(joseph_aac_config);  
  791.     joseph_aac_config = NULL;  
  792.     //video part  
  793.     free(joseph_mp4_config);  
  794.     joseph_mp4_config = NULL;  
  795.    
  796.     printf("%s:[%d] The sys changover succeed !\n",__FUNCTION__,__LINE__);    
  797.     return 0;  
  798. }</span>  

【秦江故人】微信公众号,欢迎各位关注,交流。


0 0