2010-01-29 16 views
0

누구나 ffmpeg를 오디오 대기열로 사용할 수있게 만들었습니다. 대기열을 만들려고 할 때 오류가 발생합니다. 단지 나는 오디오 큐가 작동하도록하는 방법을 알아낼 수 있다면ffmpeg 오디오 및 iphone

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

I remoteio의 생각하지만에 많은 문서가 is'nt.

완전한 수업을위한 코드를 다른 사람들과 공유해 나에게 도움이 될 것입니다.

아이디어는 전달 된 모든 스트리밍 비디오를 재생하는 단일보기 컨트롤러를 사용하는 것입니다. 아이폰에서는 ffplay와 유사하지만 sdl 오버 헤드는 없습니다.

답변

2

AudioStreamBasicDescription 구조에서 몇 가지 중요한 사양이 누락 될 수 있습니다. ffmpeg에 대해서는 모르겠지만 프레임 당 0 바이트를 지정하고 패킷 당 0 바이트를 지정하면 작동하지 않습니다.) 다음은 어떻게 작성합니까? 내가 여기 당신이 오디오 PCM 샘플을 작성하는 가정

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; 

: 구조는 samplerate오디오 형식, 채널의 수와 샘플비트를 제공 장치. 작업중인 오디오 형식을 알고있는 한이를 적용하는 데 문제가 없어야합니다. 기억해야 할 중요한 사항은이 모든 것들의 의미입니다. 여기서는 패킷 당 하나의 샘플 프레임으로 작업하므로 패킷 당 바이트 수가 샘플 프레임 당 바이트 수와 일치합니다.

잘못된 컨텍스트에서 "샘플", "샘플 프레임"과 같은 단어의 잘못된 사용이 많기 때문에 대부분의 문제가 발생합니다. 샘플 프레임은 오디오의 원자 단위로 생각할 수 있습니다 사용 가능한 모든 채널을 포함하는 데이터의 경우 샘플은 샘플 프레임을 구성하는 데이터의 단일 하위 단위를 나타냅니다.

예를 들어, 샘플 당 16 비트의 해상도로 2 채널의 오디오 스트림이 있습니다. 샘플 크기가 2 바이트 (16bps/8 또는 16 >> 3)로 커지면 샘플 프레임도 채널 수를 고려하므로 4 바이트 큽니다 (2 바이트 x 2 채널).

중요 이 배경 지식은 iPhone에만 적용되는 것이 아니라 일반적으로 오디오 코딩에 적용됩니다! AudioQueues에서 오디오 스트림에 대한 잘 정의 된 사양을 묻습니다. 그래도 좋습니다.하지만 오디오 데이터 크기를 오디오 프레임으로 표현하는 것이 항상 좋으므로 바이트를 요청할 수는 있지만 항상 데이터 크기를 변환 할 수 있습니다 그것에 대해 확신하십시오.