Qt开发笔记之编码h264码流并封装mp4(六):ubuntu平台编译mp4v2并封装mp4

简介: Qt开发笔记之编码h264码流并封装mp4(六):ubuntu平台编译mp4v2并封装mp4

前言

      前面尝试在windows下编译,实在过不了,只好转战至ubuntu

 

Ubuntu下mp4v2库编译

步骤一:下载、放入编译文件夹并解压

步骤二:配置configre

步骤三:编译make,错误‘\0’

直接修改下源码

继续编译。

 

Demo演示

H264转mp4

注意:转换后的结果不对,原来效果为:

笔者尝试至少4套不同人封装的mp4v2代码,以及将视频文件给到专做视频的使用mp4v2结果也是一样,没有再深入去研究,欢迎读者解决该问题,笔者后续有时间会继续研究。

      使用ffmpeg命令转mp4是正常的,转换指令如下:

ffmpeg -i cuc_ieschool_640x360_yuv420p.h264 -vcodec copy -f mp4 1.mp4

 

关键代码

bool X264Manager::testH264ToMp4(QString h264File, QString destFile)
{
    bool ret = false;
    // 检测输入文件
    if(!h264File.endsWith(".h264"))
    {
        qDebug() << __FILE__ << __LINE__ << "Failed to recgnize ext:" << h264File;
        return ret;
    }
    // 检测输出文件
    if(destFile.isEmpty())
    {
        destFile = h264File;
        destFile.truncate(destFile.lastIndexOf(".yuv"));
        destFile += ".mp4";
    }else if(!destFile.endsWith(".mp4"))
    {
        qDebug() << __FILE__ << __LINE__ << "Failed to recgnize ext:" << destFile;
        return ret;
    }
    qDebug() << __FILE__ << __LINE__ << h264File << "to" << destFile;
    FILE *pIn = NULL;
    unsigned char *pBuf = (unsigned char *)malloc(1024*1024);
    unsigned char *pBuf2 = (unsigned char *)malloc(1024*1024);
    unsigned char *pNalu = NULL;
    unsigned char naluType;
    int len;
    int num = 0;
    MP4FileHandle pHandle = NULL;
    MP4TrackId videoId;
    int width = 640;
    int height = 360;
    int frameRate = 25;
//    int timeScale = 9600;
    int timeScale = 1000;
    int addStream = 1;
    // 打开.h264流文件
    pIn = fopen(h264File.toUtf8().data(), "rb");
    if(!pIn)
        return -1;
//     创建mp4文件
    pHandle = MP4Create(destFile.toUtf8().data(), 0);
//    pHandle = MP4CreateEx(destFile.toUtf8().data(), 0, 1, 1, 0, 0, 0, 0);
    if(pHandle == MP4_INVALID_FILE_HANDLE)
    {
        printf("ERROR:Create mp4 handle fialed.\n");
        return -1;
    }
    // 设置timescale
    MP4SetTimeScale(pHandle, timeScale);
    while(1)
    {
        len = getNalu(pIn, pBuf);
        {
            printf("len(%d)\n", len);
        }
        if (len <= 0)
            break;
        if (pBuf[0] != 0 || pBuf[1] != 0 || pBuf[2] != 0 || pBuf[3] != 1)
            continue;
        len -= 4;
        pNalu = pBuf+4;
        naluType = pNalu[0]&0x1F;
        switch (naluType)
        {
            case 0x07: // SPS
                printf("------------------------------------\n");
                printf("sps(%d)\n", len);
                if (addStream)
                {
                    videoId = MP4AddH264VideoTrack
                            (pHandle,
                            timeScale,              // 一秒钟多少timescale
                            timeScale/frameRate,    // 每个帧有多少个timescale
                            width,                  // width
                            height,                 // height
                            pNalu[1],               // sps[1] AVCProfileIndication
                            pNalu[2],               // sps[2] profile_compat
                            pNalu[3],               // sps[3] AVCLevelIndication
                            3);                     // 4 bytes length before each NAL unit
                    if (videoId == MP4_INVALID_TRACK_ID)
                    {
                        printf("Error:Can't add track.\n");
                        return -1;
                    }
                    MP4SetVideoProfileLevel(pHandle, 0x7F);
                    addStream = 0;
                }
                MP4AddH264SequenceParameterSet(pHandle, videoId, pNalu, len);
                break;
            case 0x08: // PPS
//                printf("pps(%d)\n", len);
                MP4AddH264PictureParameterSet(pHandle, videoId, pNalu, len);
                break;
            default:
                memcpy(pBuf + 4, pBuf, len);
                pBuf[0] = (len>>24)&0xFF;
                pBuf[1] = (len>>16)&0xFF;
                pBuf[2] = (len>>8)&0xFF;
                pBuf[3] = (len>>0)&0xFF;
                printf("slice(%d, %d, %d, %d)(%d, %d, %d, %d)\n", \
                        pBuf[0], pBuf[1], pBuf[2], pBuf[3], pBuf[4], \
                        pBuf[5], pBuf[6], pBuf[7]);
                MP4WriteSample(pHandle, videoId, pBuf, len+4,\
                               MP4_INVALID_DURATION, 0, 1);
                break;
        }
    }
    free(pBuf);
    fclose(pIn);
    MP4Close(pHandle, 0);
}

 

结论

可能换一个mp4库尝试,验证一下。

 

入坑一:封装出的mp4文件出现马赛克或者模糊的情况。

尝试:

      自己写代码,网上代码,自己对比文件(读者有兴趣可以弄,暂未弄),暂未解决。

解决方法:

      暂未解决,有时间再弄,短期内决定尝试换一个库,同样期待大佬定位并解决mp4v2库这个问题,解决了欢迎联系笔者:QQ21497936,提供解决方法。



相关文章
|
并行计算 PyTorch TensorFlow
Ubuntu安装笔记(一):安装显卡驱动、cuda/cudnn、Anaconda、Pytorch、Tensorflow、Opencv、Visdom、FFMPEG、卸载一些不必要的预装软件
这篇文章是关于如何在Ubuntu操作系统上安装显卡驱动、CUDA、CUDNN、Anaconda、PyTorch、TensorFlow、OpenCV、FFMPEG以及卸载不必要的预装软件的详细指南。
12812 4
|
Ubuntu 搜索推荐 Linux
详解Ubuntu的strings与grep命令:Linux开发的实用工具。
这就是Ubuntu中的strings和grep命令,透明且强大。我希望你喜欢这个神奇的世界,并能在你的Linux开发旅程上,通过它们找到你的方向。记住,你的电脑是你的舞台,在上面你可以做任何你想做的事,只要你敢于尝试。
579 32
|
监控 Ubuntu Linux
视频监控笔记(五):Ubuntu和windows时区同步问题-your clock is behind
这篇文章介绍了如何在Ubuntu和Windows系统中通过设置相同的时区并使用ntp服务来解决时间同步问题。
564 4
视频监控笔记(五):Ubuntu和windows时区同步问题-your clock is behind
|
Ubuntu 应用服务中间件 nginx
Ubuntu安装笔记(三):ffmpeg(3.2.16)源码编译opencv(3.4.0)
本文是关于Ubuntu系统中使用ffmpeg 3.2.16源码编译OpenCV 3.4.0的安装笔记,包括安装ffmpeg、编译OpenCV、卸载OpenCV以及常见报错处理。
1285 2
Ubuntu安装笔记(三):ffmpeg(3.2.16)源码编译opencv(3.4.0)
|
Ubuntu Linux C语言
Ubuntu安装笔记(二):ubuntu18.04编译安装opencv 3.4.0 opencv_contrib3.4.0
本文介绍了在Ubuntu 18.04系统上编译安装OpenCV 3.4.0及其扩展包opencv_contrib 3.4.0的详细步骤,包括下载源码、安装依赖、配置CMake和编译安装,以及常见问题的解决方法。
1586 1
Ubuntu安装笔记(二):ubuntu18.04编译安装opencv 3.4.0 opencv_contrib3.4.0
|
Unix 网络虚拟化 C++
VS2022+Qt5.14.2成功编译MITK2022.10
使用VS2022和Qt5.14.2成功编译MITK2022.10的过程,包括编译结果的截图、遇到的编译问题的解决方法、两个重要的注意事项(patch文件格式的修改和ITK-gitclone-lastrun文件的存在),以及参考链接。文中详细描述了如何解决编译过程中遇到的错误C2220和警告C4819,以及如何修改文件编码和尾行格式。
1189 1
VS2022+Qt5.14.2成功编译MITK2022.10
vtkdicom0.8_vtk9.2_dcmtk3.6.7_qt6.2编译OK
本文介绍了如何编译整合VTK 9.2、DICOM 0.8、DCMTK 3.6.7和Qt 6.2的步骤,包括安装Qt、CMake配置以及确认相关路径和版本设置。
536 1
vtkdicom0.8_vtk9.2_dcmtk3.6.7_qt6.2编译OK
|
开发框架 缓存 Ubuntu
dotnet开发框架+ubuntu防火墙命令+win11设置自动登录+阿里云短信发送限制
dotnet开发框架+ubuntu防火墙命令+win11设置自动登录+阿里云短信发送限制
291 3
|
Ubuntu Linux Python
如何利用wsl-Ubuntu里conda用来给Windows的PyCharm开发
如何在WSL(Windows Subsystem for Linux)的Ubuntu环境中使用conda虚拟环境来为Windows上的PyCharm开发设置Python解释器。
2923 1
|
计算机视觉
vs2019_qt6.2.4_dcmtk3.6.7_vtk9.2.2_itk5.3_opencv4.6.0编译记录
这篇文章记录了使用VS2019编译Qt6.2.4、DCMTK3.6.7、VTK9.2.2、ITK5.3和OpenCV4.6.0的过程,包括下载和编译步骤,并提供了遇到编译错误时的解决方案和参考链接。
588 0
vs2019_qt6.2.4_dcmtk3.6.7_vtk9.2.2_itk5.3_opencv4.6.0编译记录