顯示具有 技術-音訊視訊處理 標籤的文章。 顯示所有文章
顯示具有 技術-音訊視訊處理 標籤的文章。 顯示所有文章

2018年4月28日 星期六

Audio 開發參考資料

本篇整理開發Audio應用時的一些參考資料。

Digital Audio 原理
数码音频系统是通过将声波波形转换成一连串的二进制数据来再现原始声音的,实现这个步骤使用的设备是模/数转换器(A/D)它以每秒上万次的速率对声波进行采样,每一次采样都记录下了原始模拟声波在某一时刻的状态,称之为样本。将一串的样本连接起来,就可以描述一段声波了,把每一秒钟所采样的数目称为采样频率或采率,单位为HZ(赫兹)。
貝(dB)是十分之一貝爾(B):1B = 10dB。1貝爾的兩個功率量的比值是10:1,1貝爾的兩個場量的比值是功率之比是10,則其分貝數湊巧也是10。功率之比是2,則約為3分貝,更精確地說是103/10或1.9953,與2相比較有0.24%的誤差。類似地,3分貝意味著電壓之比約是或1.414。6分貝對應功率增加了4倍,電壓增加了2倍。6分貝的功率之比確切值是106/10或3.9811,與4的誤差為0.5%.

TinyALSA
tinyalsa是Google在Android 4.0之後推的基於alsa內核的用戶層音頻接口。在Android 4.0之前還一直是使用這alsa-lib接口。
1 frame of a Stereo 48khz 16bit PCM stream is 4 bytes.
1 frame of a 5.1 48khz 16bit PCM stream is 12 bytes.

ALSA

Audio Sample

Echo Cancellation

Source Code Example
  • Read Wave File
  • TBD

其他


2018年3月10日 星期六

2018年2月13日 星期二

2018年1月30日 星期二

[Embedded] convert binary data to c array

將二進位資料轉換成 C 語言的陣列,是程序員常會用到的一個小技巧。本篇以一個例子說明如何在 linux 環境下達到此目的。

2017年1月29日 星期日

JPEG 編碼解碼流程

網路串流影像的主流格式是 H.264, H.265 以及 VP9,不過針對特殊應用,仍有使用 JPEG的地方。本篇參考WIKI 說明,整理 JPEG 編解碼流程,以及 JFIF 格式封裝方法,方便自己遇到問題時可以當作參考。

JPEG 編碼流程

  1. 將 RGB 轉換為 YUV。
  2. 將 YUV444 轉換為 YUV422 或 YUV420。
  3. 將 Y 區域劃分成多個 8x8 子區域,每個區域使用 DCT 轉換到頻率空間。轉換之後,每個子區域的左上角會使用差分編碼,其他欄位會使用行程編碼
  4. 量化,把人眼不容易辨別的差異移除。其實現方式就是把很多更高頻率的成份捨位成為接近0,且剩下很多會變成小的正或負數。這是整個壓縮過程中的主要失真運算。
  5. entropy coding:將影像成份以Z字型(zigzag)排列,把相似頻率群組在一起(矩陣中往左上方向是越低頻率之係數,往右下較方向是較高頻率之係數),插入長度編碼的零,且接著對剩下的使用霍夫曼編碼

2014年3月11日 星期二

iOS -- 錄音功能實作

近日針對 iOS 設備的錄音功能做一研究,整理如下:

一、聲音來源

錄音時,其聲音來源可能有以下兩處,
  • 麥克風
  • 正在播放的音頻資料(可能來自本地端的檔案,或是遠端的音頻資料)
可以分別選擇不同來源進行錄音,也可以將兩種聲音進行 mix

2014年1月20日 星期一

ffmpeg -- 使用 ffmpeg 命令降低 H.264 檔案大小

參考 x264EncodingGuide,使用裡頭的一個例子進行轉檔,以減少檔案大小。如下:
ABR (Average Bit Rate)
ffmpeg -i input -c:v libx264 -b:v 256k output.mp4 
轉好後的檔案的確降低 bitrate,但轉換後的檔案卻多出了 B-frame,如此可能會造成某些串流播放器播放時的困難。

以下記錄此問題的解決過程:

2013年10月1日 星期二

H.264 sps/pps online parser

Input SPS/PPS in base64 encoded form, and press go.Then you can get the detail information of SPS/PPS.


Test Now
SPS:
PPS:

H.264 sps/pps parser

I write a simple javascript to parse sps/pps.

If you are interested the implementation, you can find the source code in my github.

Usage
  1. Download the html from here 
  2. Use browser to open the html
  3. Input sps and pps
  4. Press go and then the result will show in the same pages

2013年9月22日 星期日

FFMPEG -- WMA 轉換為 AAC 並存檔為 MP4

台灣地區的網路線上廣播,一般都是採用微軟的方式,其方法主要有兩個重點
  • 透過 MMS(Microsoft Media Server) 協定來傳送音樂
  • 使用 WMA(Windows Media Audio) 的格式來封裝音樂

2013年6月28日 星期五

使用 WireShark 取出串流中的H.264封包,並進行撥放

以下將紀錄如何使用 wireshark 將串流中的封包取出,儲存為檔案之後,使其可利用一般播放器進行播放。


實驗步驟如下

1. 使用 wireshark 將封包存成 pcap

2. 使用 wireshark 打開儲存的 pcap 檔案

2013年6月6日 星期四

FFMPEG -- 將 H.264 的資料封裝成 MP4 檔案

在開發 iphone 下的串流app時,需要一個將串流資料存成mp4檔案的功能,以下會紀錄此次實驗過程中遇到的問題與解決方法。

基本概念

透過下列的 3 個 FFMPEG API,將資料封裝成 mp4 格式。
  • av_write_header 
  • av_interleaved_write_frame 
  • av_write_trailer
想直接看程式的人,可以參考這個範例,想直接在 iphone下測試,可以下載我寫的一個簡單範例。 

2013年6月4日 星期二

FFMPEG -- 網路收音機實作

前幾天信箱中收到了一個問題,詢問如何接收網路上廣播的音樂,因此藉著這個機會研究了一下播放網路廣播的方法。


一般網路上常見的廣播電台有幾個性質

  • 使用 mms 協定 (mms://xxx.xx.xx.xx)
  • 使用 WMA codec


針對這兩個特性,常見的網路收音機有兩種實作方式:

  • 使用 libmms 接收封包,封裝成 AVPacket後再使用 FFMPEG 進行解碼。
  • 直接使用 FFMPEG 進行封包接收與解碼。

2013年5月22日 星期三

FFMPEG -- Save streaming data as image in iOS

近期需要在 iPhone 的串流應用程式加上擷取圖片的功能,將自己的實作經驗作一整理。

Step 1. 使用FFMPEG取得串流內的影像資料,並進行解碼
av_read_frame(pFormatCtx, &packet); avcodec_decode_video2(videoCodecCtx, DecodedFrame, &frameFinished, & packet);

2013年4月11日 星期四

FFMPEG --  在 iOS 設備上播放 AAC 音樂

使用 FFMPEG 顯示影像的功能已經完成,接著便是要進行播放音樂的工作了,此處我選擇播放的音樂檔案為 AAC 格式。以下介紹整個實作流程。

一、AAC 格式

參考維基百科,AAC 共有以下七種格式
  • audio/aac, 
  • audio/aacp, 
  • audio/3gpp, 
  • audio/3gpp2, 
  • audio/mp4, 
  • audio/MP4A-LATM, 
  • audio/mpeg4-generic

2013年4月10日 星期三

FFMPEG -- AAC 轉換為 WAV


最近撰寫程式,使用 ffmpeg 將 AAC檔案 轉為 WAV檔案,在實作過程中發現轉換後的聲音品質很差。
主要是因為ffmpeg解開AAC之後的格式與預期不同,因此需要做 resample 的動作。

造成問題原因:
ffmpeg 會將 AAC 解成 AV_SAMPLE_FMT_FLTP 格式 (32bits per sample)
但是製作 PCM 時所需要用的是 AV_SAMPLE_FMT_S16 格式 (16bits per sample),因此需要進行轉換

2013年4月6日 星期六

FFMPEG -- iPhone下的效能優化

近期需要使用 FFMPEG 在 iOS 設備下,因此對其效能優化作一討論。我的測試資料如下:
  • FFMPEG 版本為 Jan 27, 2013 
  • 測試程式使用 iFrameExtractor
  • 測試檔案使用的檔案為 http://mm2.pcslab.com/mm/7h800.mp4 (H.264 800kbs)
  • 測試設備為 iPad2

主要優化的目標是減少下列兩個行為的執行時間
  • Decode Frame
  • Scale and Render

2013年3月12日 星期二

轉載 ARM compiler shoot-out for ffmpeg

FFMPEG 的編譯參數,與各種編譯器編譯後的效能比較
轉載自 http://hardwarebug.org/2009/08/05/arm-compiler-shoot-out/


2013年3月11日 星期一

FFMPEG -- Source Code 學習心得

近期想要在 iOS 設備上開發一個可以正確撥放串流的軟體,為了快速開發,將會使用許多Open Source,鑒於許多軟體都直接使用 FFMPEG ,因此將對此 Open Source 作一研究。

摘錄FFmpeg介紹如下:
FFmpeg是一個自由軟體,可以執行音訊和視訊多種格式的的錄影、轉檔、串流功能,包含了libavcodec ─這是一個用於多個專案中音訊和視訊的解碼器函式庫,以及 libavformat ——一個音訊與視訊格式轉換函式庫。
針對我的用途,需要了解的應該著重於libavcodec,並且需要特別針對其中 MJPEG, MPEG4, H.264這三種codec。以下分篇介紹與 ffmpeg 有關的研究心得。

2013年3月7日 星期四

FFMPEG -- 如何得知平台是否支援硬體加速?


在移植 FFMPEG 時心裡一直有個疑問,該如何得知 FFMPEG 所移植的平台是否支援硬體加速呢?若 FFMPEG 函數庫本身可以直接使用機器上的硬體加速,這樣是不是就不需要擔心 decode/encode 的速度了。