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頭格式分析:
- 前五個位元組為 AAC object types LOW 2
- 接著4個位元組為 位元速率index 160008
- 接著4個位元組為 channels 個數 1
- 應打印出的正確2進位制形式為 00010 | 1000 | 0001 | 000
- 281
- 前五個位元組為 AAC object types LOW 2
-
接著4個位元組為 位元速率index
- 接著4個位元組為 channels 個數 1
- 應打印出的正確2進位制形式為 00010 | 1000 | 0001 | 000
- 281
所以為(20,8)
4、規定時間刻度問題,一般網上都是設定90000,這個90000是指1秒的tick數,其實也就是把1秒中分為90000份,在新增音視訊的函式中
durationMP4_INVALID_DURATION
檢視文字列印- bool MP4WriteSample(
-
MP4FileHandle hFile,
- MP4TrackId trackId,
- u_int8_t* pBytes,
- u_int32_t numBytes,
- MP4Duration duration = MP4_INVALID_DURATION,
- MP4Duration renderingOffset = 0,
- bool isSyncSample = true//如果是視訊,此處是指當前視訊幀是否是關鍵幀,如果是則為1,如果不是則為0
- );
- bool MP4WriteSample(
- MP4FileHandle hFile,
- MP4TrackId trackId,
- u_int8_t* pBytes,
- u_int32_t numBytes,
- MP4Duration duration = MP4_INVALID_DURATION,
- MP4Duration renderingOffset = 0,
- bool isSyncSample = true//如果是視訊,此處是指當前視訊幀是否是關鍵幀,如果是則為1,如果不是則為0
- );
視訊:
檢視文字列印- MP4AddH264VideoTrack(MP4FileHandle hFile,
- uint32_t timeScale,
- MP4Duration sampleDuration,
- uint16_t width,
- uint16_t height,
- uint8_t AVCProfileIndication,
- uint8_t profile_compat,
- uint8_t AVCLevelIndication,
- uint8_t sampleLenFieldSizeMinusOne)
- sampleDuration為視訊的固定的視訊幀的顯示時間,計算的方法為timeScale(90000)* during(這個值是當前視訊幀的採集時間 - 上一幀的視訊
- 採集時間)/1000,公式也可以改為timeScale(90000)/fps(位元速率例如20f)
- 音訊:
- sampleDuration
- MP4TrackId MP4AddAudioTrack(
- MP4FileHandle hFile,
- u_int32_t timeScale,
- u_int32_t sampleDuration,
- u_int8_t audioType = MP4_MPEG4_AUDIO_TYPE
- )
- sampleDuration 是音訊的音訊幀在時間刻度上存在的時間,這裡的timeScale為音訊的取樣時間,例如44100,32000,計算方法給上面的視訊一樣的。
- sampleDuration主要作用是用於音視訊同步問題。
- 5、mp4v2錄製視訊中h264的格式要求:NAL長度+NAL資料,如果傳過來的資料沒有0x00000001則是純資料
- (1)h264流中的NAL,頭四個位元組是0x00000001;
- (2)mp4中的h264track,頭四個位元組要求是NAL的長度,並且是大端順序;
- (3)mp4v2很可能針對此種情況並沒有做處理,所以寫到mp4檔案中的每個NAL頭四個位元組還是0x00000001.
- 因此如果傳過來的h264資料是純資料的話則需要如下修改:
- int nalsize = frameSize;
- buf[0] = (nalsize&0xff000000)>>24;
- buf[1] = (nalsize&0x00ff0000)>>16;
- buf[2] = (nalsize&0x0000ff00)>>8;
- buf[3] = nalsize&0x000000ff;如果頭部格式有其他的,則按照上面的方式偏移到純資料位置。
- 6、mp4v2錄製視訊中aac的格式要求:有時遠端傳過來的aac資料的格式為adts+aac純資料,則需要將adts部分去掉,即需要偏移7個位元組的單位
- 下面就開始編寫如何呼叫mp4v2庫的方法:
- #include <stdio.h>
- #include <string.h>
- #include"../mp4v2/mp4v2.h"
- #include"AppCameraShooting.h"
- MP4TrackId video;
- MP4TrackId audio;
- MP4FileHandle fileHandle;
- unsigned char sps_pps_640[17] = {0x67, 0x42, 0x40, 0x1F, 0x96 ,0x54, 0x05, 0x01, 0xED, 0x00, 0xF3, 0x9E, 0xA0, 0x68, 0xCE, 0x38, 0x80}; //儲存sps和pps
- int video_width = 640;
- int video_height = 480;
- //視訊錄製的呼叫,實現初始化
- JNIEXPORT bool JNICALL Java_com_seuic_jni_AppCameraShooting_mp4init
- (JNIEnv *env, jclass clz, jstring title, jint type)
- {
- constchar* local_title = (*env)->GetStringUTFChars(env,title, NULL);
- //建立mp4檔案
- fileHandle = MP4Create(local_title, 0);
- if(fileHandle == MP4_INVALID_FILE_HANDLE)
- {
- returnfalse;
- }
- memcpy(sps_pps, sps_pps_640, 17);
-
相關推薦
Mp4v2實現h264+aac打包成Mp4視訊檔案
使用mp4v2實現錄製mp4視訊,需要準備如下資訊: 1、獲取mp4v2原始碼並編譯成庫檔案,對於mp4v2的編譯可以看前面的文章android 編譯mp4v2 2.0.0生成動態庫 ; 2、獲取h264資料中的sps和pps資料,如果不會的話可以檢視前面
如何使用mp4v2將H264+AAC裸流錄製成mp4檔案,並保持音視訊同步【原始碼】【mp4】【錄影】
前言: mp4檔案目前已經成為了流媒體音視訊行業的通用標準檔案格式,它是基於mov格式基礎上演變來的,特別適合多平臺播放,錄製一次,多個平臺都可使用。但是,由於mp4格式相對比較複雜,直到mp4v2這個開源工程的出現,解決了這個問題。 通常,我們在使用mp4檔案時
h264 裸流打包成mp4 注意事項
需求: Android 端把網路攝像頭的一段正在播放的視訊流,擷取儲存成mp4(按錄影按鈕時開始錄影)。 實現: ffmpeg + x264 + sdl; h264 裸流 打包成MP4,在網上也有一大堆文章,ffmpeg 也有一個muxing 的 example,大致流程都
使用mp4v2將H264+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