2

誰かがffmpegをオーディオキューで動作させることができましたか?キューを作成しようとするとエラーが発生します。

ret = avcodec_open(enc, codec);

if (ret < 0) {
    NSLog(@"Error: Could not open video decoder: %d", ret); 
    av_close_input_file(avfContext); 
    return; 
}


if (audio_index >= 0) { 
    AudioStreamBasicDescription
    audioFormat;

    audioFormat.mFormatID = -1;

    audioFormat.mSampleRate =
    avfContext->streams[audio_index]->codec->sample_rate;

    audioFormat.mFormatFlags = 0;

    switch (avfContext->streams[audio_index]->codec->codec_id)
    {
    case CODEC_ID_MP3: 
        audioFormat.mFormatID = kAudioFormatMPEGLayer3; 
        break;

    case CODEC_ID_AAC: 
        audioFormat.mFormatID = kAudioFormatMPEG4AAC;
        audioFormat.mFormatFlags = kMPEG4Object_AAC_Main;
        break;

    case CODEC_ID_AC3:
        audioFormat.mFormatID = kAudioFormatAC3; 
        break; 
    default: 
        break; 
    }

    if (audioFormat.mFormatID != -1) { 
        audioFormat.mBytesPerPacket = 0; 
        audioFormat.mFramesPerPacket =
        avfContext->streams[audio_index]->codec->frame_size;

        audioFormat.mBytesPerFrame = 0;

        audioFormat.mChannelsPerFrame = avfContext->streams[audio_index]->codec->channels;

        audioFormat.mBitsPerChannel = 0;

        if (ret = AudioQueueNewOutput(&audioFormat, audioQueueOutputCallback, self, NULL, NULL, 0, &audioQueue)) {

            NSLog(@"Error creating audio output queue: %d", ret);
        }

オーディオのみの問題、

オーディオキューを機能させる方法を理解できれば、ビデオは完璧です。

http://web.me.com/cannonwc/Site/Photos_6.html

私はremoteioのことを考えていますが、それに関するドキュメントはあまりありません。

クラス全体のコードを、それを機能させるのに役立つ人と共有します。

アイデアは、iphoneのffplayに似ていますが、sdlのオーバーヘッドがない、渡されたストリーミングビデオを再生する単一のViewControllerを用意することです。

4

1 に答える 1

2

AudioStreamBasicDescription 構造体のいくつかの重要な仕様が欠落している可能性があります: ffmpeg についてはわかりませんが、フレームごとに 0 バイト、パケットごとに 0 バイトを指定しても機能しません;) samplerateaudio formatチャンネル数、サンプルあたりのビット数:

iAqc.mDataFormat.mSampleRate = iSampleRate;
iAqc.mDataFormat.mFormatID = kAudioFormatLinearPCM;
iAqc.mDataFormat.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked;
iAqc.mDataFormat.mBytesPerPacket = (iBitsPerSample >> 3) * iNumChannels;
iAqc.mDataFormat.mFramesPerPacket = 1;
iAqc.mDataFormat.mBytesPerFrame = (iBitsPerSample >> 3) * iNumChannels;
iAqc.mDataFormat.mChannelsPerFrame = iNumChannels;
iAqc.mDataFormat.mBitsPerChannel = iBitsPerSample;

ここでは、オーディオ デバイスに PCM サンプルを書き込んでいるとします。作業しているオーディオ形式を知っている限り、それを適応させることに問題はないはずです。覚えておくべき重要なことは、これらすべてが何を意味するかということです。ここでは、パケットごとに 1 つのサンプル フレームを使用しているため、パケットごとのバイト数はサンプル フレームごとのバイト数と一致します。

ほとんどの問題は、「サンプル」、「サンプル フレーム」などの単語が間違った文脈で不適切に使用されているために発生します。サンプル フレームは、すべてを包含するオーディオ データの原子単位と考えることができます。サンプルとは、サンプル フレームを構成するデータの単一のサブユニットを指します。

たとえば、サンプルあたり 16 ビットの解像度を持つ 2 チャネルのオーディオ ストリームがあるとします。サンプルは 2 バイトの大きさ (16bps/8 または 16 >> 3) になり、サンプル フレームはチャネル数も考慮します。であるため、4 バイト (2 バイト x 2 チャネル) の大きさになります。

重要 この理論は iPhone だけに当てはまるのではなく、オーディオ コーディング全般に当てはまります。たまたま、AudioQueues がオーディオ ストリームに関する明確に定義された仕様を要求することがありますが、それは良いことですが、代わりにバイトを要求される可能性があります。そのため、オーディオ データ サイズをオーディオ フレームとして表現することは常に適切であり、いつでもデータ サイズを変換して、それについて確信してください。

于 2010-01-29T19:27:22.723 に答える