Android のオーディオとビデオの開発、詳細な PCM オーディオのリサンプリング、PCM エンコーディング

 

 ライブオーディオ、2 つのデータを結合できますか? 一緒にスーパーインポーズすることはできません。ノイズがマージされてから、生放送の例をプッシュするためにコード化されます

クライアントプレーヤー、複数のプレーヤーを開くことができます

私たちの場合、このストリームをマージしてプッシュするだけで、形式を統一するためにリサンプリングが行われることが多く、最終的には同じ pcm 形式に変換されます。

結合されたコード ストリームは、ミキシング用の複数のオーディオ ソースの組み合わせをサポートする ffmpeg amix を介して混合し、次に 2 次エンコードを行うことができます。

振幅が大きいほど音が大きく、スピーカーを観察し、運転中に音楽が大きくなり、振動振幅を手で比較します

 波形シミュレーション時間 1 秒間にどれくらいのデータを収集できますか? 1 秒間に 100 万回収集できますが、このハードウェア コストを処理できるでしょうか?

ハードウェアのサンプリング速度が速ければ速いほど、より多くのハードウェア リソースが必要になり、コストも高くなります。現実の世界で収集できる周波数は、2 で割って 2 回収集し、

現実世界の500khzの周波数、1000khzまで集音できますが、人間の耳は500khzの音を聞くことができますか? 周波数が高い人の耳は20khzくらい聞こえますが、聞こえません。

コンピュータが 40khz 以上をキャプチャすると, 現実世界の音を収集して復元することができます. これが私たちの一般的なサンプリングレート 44.1khz 48khz の由来です. これは人間の耳の限界に基づいています. 少し冗長にした後, 44.1khz 48khz の定義を開始します.クラシック、ロスレス形式、96khz 192khz のサンプリング レートを見てください。サンプリング レートが高いほど、現実の世界をよりよく復元できます。サンプリングレートが高いほど音質が良い

 各サンプリング ポイントを表すために使用されるバイト数は?

2チャンネル

4チャンネル 

5.1チャンネル 

複数のチャネルが占有するバイト数などではなく、特定のチャネルの特定のサンプル

16bitの方が実世界への復元度が高いのはなぜですか?さっきの音の振幅もワイヤレス この音

大きいものから小さいものまで、どれくらい大きいですか、これはどれくらい小さいですか?このシミュレートされた世界は無限、シミュレートされた無限です

サンプルポイントを表すために2ビットを使用し、

2 ビットを使用して 0 1 2 3 の 4 つの値を形成し、音を記述します.たとえば、セットトップ ボックスの音を最小、ミュート、最小にすると、強度が非常に強くなります。 . 表現できる音の順序が十分でないため、少し大きく聞こえます. 音に 4 つの値しかない場合は、音量とサイズを表現できないはずです. 使用した後、おそらく 16bit で表現できます.この種のサウンドは、より良い収集と復元を実現できます。つまり、特定のサウンドの現在の振幅は 16 ビットで復元でき、一部の音質は 8 ビットなどの比較的悪いものです。聞こえるようにするには、まず pcm データを抽出します

ffmpegで抽出し、 

48k は 2 つのチャネルを生成および処理します。最初に 16 ビット フォーマットを使用します。ここでは、最初にそれを抽出します。

 抽出された huiguniang.MP3 pcm データは次のとおりです。

 

8bitで抽出したpcmデータは小さいかもしれませんが、

 u8 u8 で起動できません

ここでは 16le をプレイします

f32 これでみんな浮動小数点数の話に

f32 と s16 は同じファイルから抽出されます。この浮動小数点数は、s16 の 2 倍の大きさです。

f32 浮動小数点数のサンプルは 4 バイトなので、注意が必要です。

44.1khzと48khzがよく出てくるのは、この人の耳が20khzくらいなので、元に戻すと、20khz*2が40khzなので、44.1khzと48khzを使います。

多くの友人が、なぜ 40 ではなく 44.1khz と 48khz なのかと尋ねたことがあると思います。周波数は初期の段階で冗長性のために設定されており、平均的な人は 20khz よりも大きいことを皆に伝えていますが、一部の人はそれを少し使用するでしょう。少し。

 整数と浮動小数点数は違います.私たちのフォーマットと混同しています.再生できるか、エンコードをやり直すとノイズが発生します.たとえば、今この音を再生したので、試してみましょう.はい、今抽出した f32 と s16 ではありません. ここでは s16 の形式で再生します. f32 は浮動小数点数を再生するためのものです. それから見てみましょう.

 サウンドは非常にスパイシーです. 今後エンコードするときに表示される場合は、それがあなたのフォーマットです. 入力するエンコード要件が異なります.

 また、コードレートとビットレートは特に重要ではありません。

このpcm配列フォーマットの問題点

 8bitのサンプリングポイントを抽出するために、他にも、

 8bit はすでに s8l1 ではなく s8 と呼ばれています。1 バイトにはいわゆる大小の端がなく、この 1 バイトしかないためです。

pcmデータ配置形式の問題

オーディオ フレームはビデオほど明確ではありません。ビデオは単なる画像ですが、オーディオの場合、データのフレームとは何ですか? エンコーディング形式はそれぞれ異なります。たとえば、最も一般的なエンコーディング形式は acc です。

データのフレームとしてエンコードされるサンプルの数は? 通常は 1024 サンプルで、データのフレームとして、異なるエンコード形式が異なります。

たとえば、mp3 の場合、1152 個のサンプルがあります。

違うフォーマット 彼は違う

私は acc エンコーディングのサポートを使用しています。デフォルトは ffmpeg に付属の acc エンコーディングです。

 この記事では、acc コード 168 と libfdk_aac コード 167 の違いは何ですか?

つまり、ffmpeg 独自の aac で必要な形式はサンプリング形式です。  

パラメーターを指定するように設定します。たとえば、この pcm を読み込むと、このエンコード レイヤーは aac.aac を介して渡されます。

サフィックス aac とはどういう意味ですか? ffmpeg に付属の aac エンコーダーを使用しましたが、

デバッグできます。  

avcodec でエンコーダーを検索します。

 

これは、コードを構成する形式の種類です。ここにいくつかの説明があります。

 エンコーダーを開く方法を見つけてください。

 264 avcodecopen2 は、それを開くエンコーダー、エンコードするフォーマットを見つけます。 

AVCodec を介して 212 という名前で avcodec_find_encodel を送信します. もう一度強調させてください. この ffmpeg については、今でも質問に戻ります. aac エンコーダーについては、aac エンコーダーはいくつありますか? 別の aac エンコーダーを使用できますか? 彼は、

 ソースコードを開いて見て、知識を広げて、ffmpegの理解がどれほど深いか、特定の知識ポイントについてだけ話すことは言うまでもありません.

fdk aacを確認してください

aac カプセル化の場合、なぜ aac エンコーダーであることがわかるのですか? それは主に ID です. たとえば, 私たちの異なる aac エンコーダーは同じ ID を持っています. 主な違いはそれらの名前が異なることです. この名前は一意です.

ffmpeg に付属の aac 

この作品の id ac 名は aac です ここに別の問題があります ここにサンプルの fmts があります この aac エンコーダーにはどのような形式が必要ですか。この時点で、fdk aac と比較する必要があります。2 つの違いは使用するときに異なる形式を使用するということです. たとえば, 浮動小数点数を使用する場合,

それはまだ整数です、ここで彼をサポートするのは同じではありません、青い線の部分

つまり、最終的に使用するエンコーディングの種類と pcm 形式の種類は、さまざまなエンコーダーに応じて選択する必要があります。

 id の acc は同じで名前が異なります.サンプル数には浮動小数点数または整数を使用します.整数方式と浮動小数点方式の違いは何ですか? たとえば、s16 がマイナスかプラスか、そして s16 の範囲はどれくらいかを教えてください。

 s16 -32768~32767

flt -1~1

この浮動小数点数は無限大ではなく、-1~1のような論理になるので、例えば拡張することができます

使用

このツールは pcm データをインポートできます。この形式を見てください。

 値をインポートして見て、最初にs16をインポートしますよね?ツールにデータをインポートしています。s16 形式を選択しました。

ここで、この波形を -1 から 1.0 に変換できることがわかりますが、実際には 1.0 は整数です. サンプルをコンピューターで表現すると、

間隔を広げた後、各サンプル間に時間間隔がありますが、それを小さくします.このように見ると、少し連続しているように見えますが、実際には離散です.ここでインポートできますここに浮動小数点数、

浮動小数点数をインポートするときは、正しいものを選択する必要があります. ここでは、32 ビット浮動小数点数を選択します. 

ここで統一計画、-1~1

s16 と浮動小数点の計画が統合された後、これらの値は

これが左チャンネルです。左チャンネルは左チャンネルと比較する必要があり、右チャンネルは右チャンネルの波形と比較する必要があります。これは基本的に同じです

 その際、彼をインポートして再生し、その音を聴いたり、見比べたりすることができます。

 フォーマットのフレーム サンプル数は? データのフレームとしてエンコードされているため、特定のエンコーダーを確認する必要があります

 

 

 if (avcodec_open2 を呼び出すと、codec_ctx コンテキストがあり、codec_ctx コンテキストに frame_size パラメータがあります。このパラメータは非常に重要です。データのフレームとしてエンコードするために使用されるサンプル数は次のとおりです。 null 値、値は今まで null 値でしたが、値は 1024 になります。このとき、送信するデータの量と、エンコーダーに毎回送信されるサンプルの数から、1024 を送信することがわかります。サンプルの数は、エンコード用のデータのフレームとして対応するエンコーダーに与えられ、
268 のロジックはわずかに変更されます。

これは、指定された 48000hz の frame_size: 1024 です。 

ここをもう一度見て、これを 8k に変更します。

もう一度見て

 対応するサンプリングレート、

現在も1024  

codec_ctx の frame_size をベンチマークとして使用する必要があります

 ここには別の値があります。これがサンプリング形式です 

(codec_ctx->サンプルtmt)

 

私たちの FMT_FLTP は今述べた avc に対応していると言いましたが、それが必要とするのは通常のフォーマットですか?

AV_SAMPLE_FMT_FLTP とはどういう意味ですか? ソースコードを見てみると、

この AVSampleFormat には複数のフォーマットがあり、AV SAMPLE FMT U8 はバージョンを表し、

AV SAMPLE FMT S16 は 16 ビット表現のサンプルです。AV SAMPLE FMT S32 は 32 ビット表現のサンプルで、整数です。

AV SAMPLE FMT_FLT、32 ビット浮動小数点数、

AV SAMPLE_FMT_DBL 64 ビット表現

上 と 下 はどう違いますか?その表現形式は異なります.次のものでは、p があり、各行に p があります.ここでは、平面のみが使用されています.これはどういう意味ですか?

2 つの形式があり、1 つはインターリーブ モードと呼ばれ、もう 1 つは非インターリーブ モードと呼ばれます。

非ずらしモードは今の私たちの絵に対応しています。ここに彼を描きます。これが私たちのずらしモードです

ノンインターリーブモードもある

2つの違いは何ですか? ここでは1フレームを例に説明します. 例えば, 1024は1フレームのデータです. s16やs32の2チャンネルなら気にする必要はありません.私たちは主に平面について話します どういう意味ですか 

ここでは 2 つのチャネル、つまり 1 フレームのデータに対して、この時点でフォーマットを調整していることに注意する必要がありますが、このロジックを見て理解できますか? 左右の軸にある 1024 および 1024 LR は、このように配置されています。

次に、ノンインターレースモードについて話しましょう。

このモードの違いは何ですか? ここにはまだデータのフレーム 1024 があります, データのフレームである左右のチャネルを含みます. 主に下を見てください. インターリーブされていないデータについては, ここで保存するときに注意する必要があります. ここで 1024 を保存します. 左、次に 1024 を格納します。このようなパターン

この 2 つのモードを混同すると、再生するか、エンコードすることになります.たとえば、ローカルで s16 形式を使用しているが、このエンコーダに平面形式が必要な場合は、間違いなく問題が発生します.

 このようにして、別の 48k を f32le から s16 の形式でブロードキャストします。

なぜこの順番をいつも強調するのですか?私たちのチャンネルの何人かの友達が例を挙げているので、あなたに何か言いたいのですが、

ffmpegに付属しているaacなど、彼自身がこのデータをデコードしているのですが、デコードしてデコードしたデータはどのような形式なのでしょうか? デコードすると、浮動小数点数であることがわかります。

それから、それを s16 形式に変換する必要がある友人がいて、彼が上で解いたのは fltp 浮動小数点数平面であり、彼が解いたのは整数パックです。

転送した後、浮動小数点数に変換し、リサンプリングして s16 に変換し、s16 に変換した後、fwrite を使用してデータをローカルに書き込み、ローカルに書き込みました。彼はそれをテストしましたか?彼はすでに s16 から s16 でこのローカル リサンプリングを収集しており、その後も Zhang 氏を探し続け、こう言いました。なぜ問題があるのですか?

それから彼は私がデータを放送するようにという命令を傍受しました

この f32le を使用して、収集したデータをブロードキャストする必要があります。

明らかにリサンプリングされて s16 に変換されていますが、なぜ彼は s16 を使用してブロードキャストしないのでしょうか?

f32 に切り替えると、planar のフォーマットが使用できなくなりますが、ローカルに保存されているデータは、planar のフォーマットを使用できないため、f32le のフォーマットに変換する必要があります。

先ほどの写真の弊社 AV SAMPLE FMT FLT に対応しています。

一部の友人が AC デコードを検証するために行ったとき、彼らは f32 平面フォーマットをローカルに直接保存し、それを直接ブロードキャストしました。

このツールは、この非インターリーブ モードおよびインターリーブ モードでのみデータをインポートできます。平面モードではインポートできません。

 いろいろ絡んでますが、

 デコードコードは手動で左右のフォーマットに変換し、

対応するデータを渡し、mp3 ファイルまたは huiguniang.mp3 ファイルを読み取ります。 

ここでデバッグを見てみましょう。 

 mp3 は通常 1152 です 

 

これは mp3 が 1152 に相当します。 

しかし、詳細はエンコーダーとデコーダーのソリューションに基づいている必要があります. ここでは、frame->nb_samples; 対応するパラメーターがあることがわかります.

 フォーマットは 8 です、今表を確認しましょう、AVFrame パラメータ、この 0 1 2 3 4 5 6 は対応する平面フォーマットですので、誰もが理解できるでしょう。

このリサンプラーには、公式の例があります

ffmpeg ソースコードに例があります 

 リサンプリングについては、リサンプリング audio.c の例を参照することができますが、私たちのクラスの一部の詳細については、戻り値が判断されていないパラメータがいくつかあることに言及します, 568

彼はこれらの戻り値についていくつかの判断を下す必要がありますが、例には判断がありません. これは、リサンプリング、特に平面の形式に対応する整数と浮動小数点数、および対応するサンプリング レートに関連する原則です. なぜ44.1khzはもっとありますか、

 ストリーミング サーバー ブースト プログラミング、

 ネットワークの知識を習得することは非常に役立ちます. Tencent の学生は、音声とビデオのネットワークに関連する知識を学びませんでした. 私たちの音声とビデオは、音声とビデオの知識に最も焦点を当てています. 当時, それはの原則にリンクされていました.なぜ大きな工場はインターネットを理解していないのでしょうか?

Android のオーディオとビデオの開発、詳細な PCM オーディオのリサンプリング、PCM エンコーディング

おすすめ

転載: blog.csdn.net/chezabo6116/article/details/129753354