Paquete de biblioteca MP4v2 MP4

1. Compilación cruzada mp4v2

Descargue la versión adecuada del código fuente mp2v2, descargué el paquete 2.0.0 bz mp4v2_2.0.0 ~ dfsg0.orig.tar.bz2

tar jxf mp4v2_2.0.0 ~ dfsg0.orig.tar.bz2
cd mp4v2-2.0.0;

./configure --host = arm-hisiv500-linux CC = arm-hisiv500-linux-gcc CXX = arm-hisiv500-linux-g ++ --disable-debug


hacer

./configure --host = arm-hisiv200-linux CC = arm-hisiv200-linux-gcc CXX = arm-hisiv200-linux-g ++ --disable-debug --disable-option-Check --enable-Optimize --disable -visibilidad --disable-gch --disable-largefile --disable-cygwin-win32 -
disable-mingw-threads --disable-dependency-tracking --disable-libtool-lock

El archivo libmp4v2.a generado está en el directorio. El archivo de encabezado libs
se encuentra en el directorio include / mp4v2. El archivo de encabezado debe copiarse por completo y el código solo debe incluir mp4v2.h

#include "mp4v2 / mp4v2.h"
1
Nota: Después de portar, vincular a libmp4v2.a requiere agregar la opción -lstdc ++.

2. código de muestra

1. Primero llame a la función MP4CreateEx () para crear el archivo MP4 de salida

Archivo MP4FileHandle = MP4CreateEx ("test.mp4", 0, 1, 1, "isom", 0x00000200, p, 4);

2. Luego configure la escala de tiempo

MP4SetTimeScale (archivo, 90000);

3. A continuación, agregue la pista de video

MP4TrackId video = MP4AddH264VideoTrack (archivo, 90000, 90000/25, 640, 480, 
                    0x4d, // sps [1] AVCProfileIndication 
                    0x40, // sps [2] 
                    profile_compat 0x1f, // sps [3] AVCLevelIndication 
                        3); // 4 bytes de longitud antes de cada unidad NAL 
MP4SetVideoProfileLevel (archivo, 0x7F); 

4. Luego agregue la pista de audio

MP4TrackId audio = MP4AddAudioTrack (archivo, 16000, 1024, MP4_MPEG4_AUDIO_TYPE); 
MP4SetAudioProfileLevel (archivo, 0x2);


5. Ahora el trabajo de creación ha terminado, y luego los datos de video y audio se escriben cíclicamente. Las funciones para escribir video y audio son:

MP4WriteSample (archivo, video, buf, tamaño, MP4_INVALID_DURATION, 0, 1); 
MP4WriteSample (archivo, audio, buf, tamaño, MP4_INVALID_DURATION, 0, 1); 

6. A continuación, debe agregar información SPS y PPS al video

MP4AddH264SequenceParameterSet (archivo, video, sps_pps, 10);
MP4AddH264PictureParameterSet (archivo, video, sps_pps + 10, 4);

7. Finalmente atraviese para agregar índice para MP4

MP4Close (archivo, 0);

8. Ejemplo de llamada Lo anterior es el flujo de llamadas de la biblioteca mp4. La cantidad de video y audio necesita escribir su propia función de prueba y pasarla. SPS y PPS deben conocerse de antemano.

int aa (void)
{
    unsigned char sps_pps [14] = {0x67, 0x4d, 0x40, 0x1F, 0x96, 0x54, 0x05, 0x01, 0xec, 0x80, 0x68, 0xce, 0x38, 0x80};
    char * p [4];
    p [0] = "isom";
    p [1] = "iso2";
    p [2] = "avc1";
    p [3] = "mp41";
    Archivo MP4FileHandle = MP4CreateEx ("test.mp4", 0, 1, 1, "isom", 0x00000200, p, 4);
    
    if (archivo == MP4_INVALID_FILE_HANDLE) 
    {
        printf ("abrir archivo fialed. \ n"); 
        regreso; 
    }
    MP4SetTimeScale (archivo, 90000);
 
    // 添加 h264 track     
    MP4TrackId video = MP4AddH264VideoTrack (archivo, 90000, 90000/25, 640, 480, 
                                            0x4d, // sps [1] AVCProfileIndication 
                                            0x40, // sps [2] 
                                            profile_compat 0x1f, // sps [3] AVCLevelIndication 
                                            3); // 4 bytes de longitud antes de cada unidad NAL 
    if (video == MP4_INVALID_TRACK_ID)
    { 
        printf (" error al  agregar pista de video. \ N"); 
        regreso; 
    } 
    MP4SetVideoProfileLevel (archivo, 0x7F); 
 
    // 添加 aac 音频 
    MP4TrackId audio = MP4AddAudioTrack (archivo, 16000, 1024, MP4_MPEG4_AUDIO_TYPE); 
    if (video == MP4_INVALID_TRACK_ID) 
    { 
        printf ("error al agregar pista de audio. \ n"); 
        regreso; 
    } 
    MP4SetAudioProfileLevel (archivo, 0x2); 
 
 
      while (mp4_read_h264_frame (fpMjpeg, buf, MP4_BUF_SIZE, & size)! = -1)
    {
        buf [0] = ((size-4) & 0xff000000) >> 24;  
        buf [1] = ((tamaño-4) y 0x00ff0000) >> 16;  
        buf [2] = ((tamaño-4) y 0x0000ff00) >> 8;  
        buf [3] = (tamaño-4) & 0x000000ff; 
        MP4WriteSample (archivo, video, buf, tamaño, MP4_INVALID_DURATION, 0, 1); 
    }
    
    while (-1! = mp4_read_aac_frame (fpPcm, buf, MP4_BUF_SIZE, & size))
    {
        MP4WriteSample (archivo, audio, buf, tamaño, MP4_INVALID_DURATION, 0, 1); 
    }
    
    MP4AddH264SequenceParameterSet (archivo, video, sps_pps, 10);
    MP4AddH264PictureParameterSet (archivo, video, sps_pps + 10, 4);
 
    MP4Close (archivo, 0);
    
    devuelve 0;
}

115 artículos originales publicados · Me gusta 29 · Visitantes 50,000+

Supongo que te gusta

Origin blog.csdn.net/huabiaochen/article/details/103211919
Recomendado
Clasificación