1. 程式人生 > >Mp4v2實現h264+aac打包成Mp4視訊檔案

Mp4v2實現h264+aac打包成Mp4視訊檔案

使用mp4v2實現錄製mp4視訊,需要準備如下資訊:

1、獲取mp4v2原始碼並編譯成庫檔案,對於mp4v2的編譯可以看前面的文章android 編譯mp4v2 2.0.0生成動態庫 ;

2、獲取h264資料中的sps和pps資料,如果不會的話可以檢視前面的文章  點選開啟連結;

3、獲取音訊解碼資訊,在呼叫MP4SetTrackESConfiguration使用,具體的獲取方式一種通過faac獲取,方法faacEncGetDecoderSpecificInfo(hEncoder,&(ASC), &(ASCLength));//得到解碼資訊另一種檢視aac音訊原始碼,並並對照aac的adts頭格式分析:

檢視文字列印
  1. 前五個位元組為 AAC object types  LOW     2
  2. 接著4個位元組為 位元速率index        160008
  3. 接著4個位元組為 channels 個數                 1
  4. 應打印出的正確2進位制形式為  00010 | 1000 | 0001 | 000
  5.                                                             281
檢視文字列印
  1. 前五個位元組為 AAC object types  LOW     2
  2. 接著4個位元組為 位元速率index        
    160008
  3. 接著4個位元組為 channels 個數                 1
  4. 應打印出的正確2進位制形式為  00010 | 1000 | 0001 | 000
  5.                                                             281

所以為(20,8)

4、規定時間刻度問題,一般網上都是設定90000,這個90000是指1秒的tick數,其實也就是把1秒中分為90000份,在新增音視訊的函式中

durationMP4_INVALID_DURATION

檢視文字列印
  1. bool MP4WriteSample(  
  2. MP4FileHandle hFile,  
  3. MP4TrackId trackId,  
  4. u_int8_t* pBytes,  
  5. u_int32_t numBytes,  
  6. MP4Duration duration = MP4_INVALID_DURATION,  
  7. MP4Duration renderingOffset = 0,  
  8. bool isSyncSample = true//如果是視訊,此處是指當前視訊幀是否是關鍵幀,如果是則為1,如果不是則為0
  9. );   
檢視文字列印
  1. bool MP4WriteSample(  
  2. MP4FileHandle hFile,  
  3. MP4TrackId trackId,  
  4. u_int8_t* pBytes,  
  5. u_int32_t numBytes,  
  6. MP4Duration duration = MP4_INVALID_DURATION,  
  7. MP4Duration renderingOffset = 0,  
  8. bool isSyncSample = true//如果是視訊,此處是指當前視訊幀是否是關鍵幀,如果是則為1,如果不是則為0
  9. );   
其中duration這個引數是指視訊幀存在的時間,在90000這個刻度上存在的時間,如果使用者確定錄影時的音訊視訊幀是按固定速率的,那麼在這裡可以設定MP4_INVALID_DURATION,這時mp4v2就會使用下面的函式中的時間刻度

視訊

檢視文字列印
  1. MP4AddH264VideoTrack(MP4FileHandle hFile,  
  2.                                     uint32_t timeScale,  
  3.                                     MP4Duration sampleDuration,  
  4.                                     uint16_t width,  
  5.                                     uint16_t height,  
  6.                                     uint8_t AVCProfileIndication,  
  7.                                     uint8_t profile_compat,  
  8.                                     uint8_t AVCLevelIndication,  
  9.                                     uint8_t sampleLenFieldSizeMinusOne)  
  10. sampleDuration為視訊的固定的視訊幀的顯示時間,計算的方法為timeScale(90000)* during(這個值是當前視訊幀的採集時間 - 上一幀的視訊  
  11. 採集時間)/1000,公式也可以改為timeScale(90000)/fps(位元速率例如20f)  
  12. 音訊:  
  13. sampleDuration  
  14. MP4TrackId MP4AddAudioTrack(  
  15. MP4FileHandle hFile,  
  16. u_int32_t timeScale,  
  17. u_int32_t sampleDuration,  
  18. u_int8_t audioType = MP4_MPEG4_AUDIO_TYPE  
  19. )   
  20. sampleDuration 是音訊的音訊幀在時間刻度上存在的時間,這裡的timeScale為音訊的取樣時間,例如44100,32000,計算方法給上面的視訊一樣的。  
  21. sampleDuration主要作用是用於音視訊同步問題。  
  22. 5、mp4v2錄製視訊中h264的格式要求:NAL長度+NAL資料,如果傳過來的資料沒有0x00000001則是純資料  
  23. (1)h264流中的NAL,頭四個位元組是0x00000001;  
  24. (2)mp4中的h264track,頭四個位元組要求是NAL的長度,並且是大端順序;  
  25. (3)mp4v2很可能針對此種情況並沒有做處理,所以寫到mp4檔案中的每個NAL頭四個位元組還是0x00000001.  
  26. 因此如果傳過來的h264資料是純資料的話則需要如下修改:  
  27.   int nalsize = frameSize;  
  28.       buf[0] = (nalsize&0xff000000)>>24;  
  29.       buf[1] = (nalsize&0x00ff0000)>>16;  
  30.       buf[2] = (nalsize&0x0000ff00)>>8;  
  31.       buf[3] = nalsize&0x000000ff;如果頭部格式有其他的,則按照上面的方式偏移到純資料位置。  
  32. 6、mp4v2錄製視訊中aac的格式要求:有時遠端傳過來的aac資料的格式為adts+aac純資料,則需要將adts部分去掉,即需要偏移7個位元組的單位  
  33. 下面就開始編寫如何呼叫mp4v2庫的方法:  
  34. #include <stdio.h>  
  35. #include <string.h>  
  36. #include"../mp4v2/mp4v2.h"
  37. #include"AppCameraShooting.h"
  38. MP4TrackId video;  
  39. MP4TrackId audio;  
  40. MP4FileHandle fileHandle;  
  41. unsigned char sps_pps_640[17] = {0x670x420x400x1F0x96 ,0x540x050x010xED0x000xF30x9E0xA00x680xCE0x380x80}; //儲存sps和pps
  42. int video_width = 640;  
  43. int video_height = 480;  
  44. //視訊錄製的呼叫,實現初始化
  45.     JNIEXPORT bool JNICALL Java_com_seuic_jni_AppCameraShooting_mp4init  
  46. (JNIEnv *env, jclass clz, jstring title, jint type)  
  47. {  
  48.     constchar* local_title = (*env)->GetStringUTFChars(env,title, NULL);  
  49.     //建立mp4檔案
  50.     fileHandle = MP4Create(local_title, 0);  
  51.     if(fileHandle == MP4_INVALID_FILE_HANDLE)  
  52.     {  
  53.         returnfalse;  
  54.     }  
  55.     memcpy(sps_pps, sps_pps_640, 17);  
  56. 相關推薦

    Mp4v2實現h264+aac打包Mp4視訊檔案

    使用mp4v2實現錄製mp4視訊,需要準備如下資訊: 1、獲取mp4v2原始碼並編譯成庫檔案,對於mp4v2的編譯可以看前面的文章android 編譯mp4v2 2.0.0生成動態庫 ; 2、獲取h264資料中的sps和pps資料,如果不會的話可以檢視前面

    如何使用mp4v2H264+AAC裸流錄製成mp4檔案,並保持音視訊同步【原始碼】【mp4】【錄影】

    前言:    mp4檔案目前已經成為了流媒體音視訊行業的通用標準檔案格式,它是基於mov格式基礎上演變來的,特別適合多平臺播放,錄製一次,多個平臺都可使用。但是,由於mp4格式相對比較複雜,直到mp4v2這個開源工程的出現,解決了這個問題。    通常,我們在使用mp4檔案時

    h264 裸流打包mp4 注意事項

    需求: Android 端把網路攝像頭的一段正在播放的視訊流,擷取儲存成mp4(按錄影按鈕時開始錄影)。 實現: ffmpeg + x264 + sdl; h264 裸流 打包成MP4,在網上也有一大堆文章,ffmpeg 也有一個muxing 的 example,大致流程都

    使用mp4v2H264+AAC合成mp4檔案

    這裡是連結: https://itunes.apple.com/cn/app/shuang-yu-bo-fang-qi-kan-dian/id950279764?mt=8 錄製程式要新增新功能:錄製CMMB電視節目,我們的板卡傳送出來的是RTP流(H264視訊和A

    如何將MP4視訊檔案轉換MP3音訊格式

    2018年11月9日,美國漫威影業公司的大作《毒液:致命守護者》開始在中國上映,作為漫威在2018年最後的壓軸鉅作自然是非常不錯的。在影片中很多激斗的場景也有共生體和宿主之間的對話,但是電影院中的電影一般為ISO映象檔案,就算在網上下載的也是MP4或者MKV等視訊檔案,有很多人喜歡聽書,那麼如何聽電影呢?

    怎麼將愛奇藝下載的qsv格式檔案無損轉換mp4視訊

    由於各大視訊播放平臺都是都脾氣的,動不動就研發一種獨特的視訊加密格式,比如說騰訊視訊的qlv格式、愛奇藝的qsv格式、優酷的kux格式……這些通過特定加密的檔案只能在特定的播放器上開啟播放,給視訊編輯、傳輸方面帶來了很大的麻煩,比如說我在愛奇藝下載了一個視訊想分享給朋友,然而朋友的電腦沒有安裝愛奇藝播放器

    fdk-aac編碼及mp4v2封裝h264+aac[完整code]

    轉載請註明出處 一. 摘要 程式碼基於fdk-aac和mp4v2編寫完成,程式碼中"MY"開頭的api系作者自己封裝的讀者可以忽略該部分。 程式碼中主要流程部分可以總結為建立aac_encoder/mp4_muxer,然後分別在h264的callback和audio capture

    H264編碼封裝MP4格式

    一、概述 本文講述的是對H264編碼且封裝成MP4格式的視訊流進行RTP打包過程時需要了解的一些基本知識。 二、H264的基礎知識 1.H264的編碼格式 H.263 定義的碼流結構是分級結構,共四層。自上而下分別為:影象層(picturelayer)、塊組層(G

    Python實現採用相對路徑打包tar壓縮檔案

    Python程式碼如下: archival_name = "test.tar" # 建立壓縮包名 tar = tarfile.open(save_path + archival_name, "w:tar") # 建立壓縮包 tar.add(os.path.joi

    用Pyinstaller把Python3.7程式打包可執行檔案exe

    1、通過pip3 install pyinstaller 安裝成功 2、然後執行命令,首先:需要切換到程式所在的目錄 執行命令 pyinstaller -F -w <檔名.py>,-F代表生成可執行檔案,-w代表需要控制檯,不需要就不用加。 3、等執行結束後,會在程式所在的資料夾生成三個資料

    python檔案打包.exe執行檔案

           現在用部落格的形式記載的,大概也只有IT行業一直持續吧!作為一名IT民工,沒有特別多特別深的行業見解,初涉江湖,記錄自己走過的路途的風景,日後回望也會覺得清晰;如果有幸能給他人一些啟發或者參照,那也算是給自己積累功德

    用Pyinstaller把Python3程式打包可執行檔案exe

    自己開發一些小工具,但是又懶得去配置環境,索性想著把py程式碼編譯可執行檔案exe 百度了很多,發現了很多牛人的無私奉獻,在此也分享下自己的心得體會。 Windows7 64位作業系統 Python3.3 32位 首先安裝PIP。 pip 是一個安裝Python包的工具

    myeclipse將javaswing程式打包可執行檔案

    上次打包過一次了,最近需要將swing程式打包成exe檔案,但是卻忘記了,為了防止再忘記,寫下這篇文章 第一步:新建一個資料夾,裡面放你專案需要的jib ,圖片,和一個jre(我的jre是1.7的) 第二步:開啟myeclipse 在剛新建的

    android平臺下基於ffmpeg對相機採集的NV21資料編碼為MP4視訊檔案

    音視訊實踐學習 android全平臺編譯ffmpeg以及x264與fdk-aac實踐 ubuntu下使用nginx和nginx-rtmp-module配置直播推流伺服器 android全平臺編譯ffmpeg合併為單個庫實踐 android-studio使用c

    gstreamer將H264碼流轉為avi視訊檔案示例

    是時候記錄怎麼使用gstreamer庫將h264碼流轉為avi、mp4、flv等視訊檔案了。 下圖是本片示例視訊合成的流程圖,其中H264 採集與佇列實現部分程式碼未貼上。 總體思想是,“視訊合成主執行緒”根據視訊資料通道建立gstreamer視訊合成pipe

    NW.js把web程式打包桌面exe檔案

    node-webkit是一個Chromium和node.js上的結合體,通過它我們可以把建立在chrome瀏覽器和node.js上的web應用打包成桌面應用,而且還可以跨平臺的哦。很顯然比起傳統的桌面應用,在某些特定領域用html5+css3+js開發的web應用更加簡單和高效,而且還可以使用node.js

    一步一步教你使用Eclipse如何把Swing專案打包exe執行檔案(二)

    一、這裡首先第一步就是把專案打包成jar包,如下圖所示: ps:小心這裡的坑。你的專案可以在eclipse裡面直接執行時沒有問題的,但是一旦脫離的話,就可能報錯:說找不到org.eclipse.swt等相關的jar包,這時就需要你手動匯入相關的jar才可以的。jar

    Tcl/tk例項—使用tclkit工具將指令碼打包可執行檔案(.exe)

    下載 tclkit.exe 工具,及 sdx.kit 檔案。 複製一份tclkit.exe ,命名為tclkit2.exe。 假設你的指令碼檔案為:app.tcl Step1: 命令列執行 tclkit.exe sdx.kit qwrap app.tcl 執

    c#程式打包可執行檔案

    經過朋友(lcm)的耐心指導,輕鬆完成了c#程式的打包,希望能夠幫助更多的戰友輕鬆打包c#。 一:前期準備工作 使用《innosetup_5.5.9》工具實現c#程式打包,程式下載地址:   htt

    在linux下把python檔案打包可執行檔案步驟

    1.安裝PyInstaller    pip install pyinstaller    pyinstaller --version2.使用PyInstaller打包python檔案  在和myscript.py同目錄下執行命令:pyinstaller mycript.py