2010-01-29 5 views
0

a été capable de faire fonctionner ffmpeg avec des files d'attente audio, j'obtiens une erreur lorsque je tente de créer la file d'attente.ffmpeg audio et l'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); <

Les problèmes que avec l'audio,

vidéo est parfait si seulement je peux comprendre comment obtenir des files d'attente audio pour travailler.

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

Je pensais de remoteio mais il is'nt beaucoup doc sur ce point. Je vais partager le code pour la classe complète avec quelqu'un qui m'aide à le faire fonctionner.

L'idée est d'avoir un seul contrôleur de vue qui lit toute vidéo en streaming qui lui est transmise, similaire à ffplay sur l'iphone mais sans la surcharge sdl.

Répondre

2

Vous pourriez très bien manquer certaines spécifications importantes dans la structure AudioStreamBasicDescription: je ne sais pas à propos de ffmpeg, mais en spécifiant zéro octets par trame et zéro octet par paquet ne fonctionnera pas;) Voici comment je remplirais la structure, étant donné la samplerate, le format audio , le nombre de canaux et les bits par échantillon:

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; 

Je suppose ici que vous écrivez des échantillons PCM pour l'audio dispositif. Tant que vous connaissez le format audio avec lequel vous travaillez, il ne devrait pas y avoir de problèmes d'adaptation: la chose importante à retenir est ce que tout cela signifie. Ici, je travaille avec une trame d'échantillon par paquet, de sorte que le nombre d'octets par paquet coïncide avec le nombre d'octets par trame d'échantillon. La plupart des problèmes viennent du fait qu'il y a beaucoup de mauvais usage de mots tels que "samples", "samples frames" dans les mauvais contextes et ainsi de suite: un exemple de frame peut être considéré comme l'unité atomique de l'audio les données qui englobent tous les canaux disponibles, un échantillon fait référence à une seule sous-unité de données composant la base de sondage. Par exemple, vous avez un flux audio de 2 canaux avec une résolution de 16 bits par échantillon: un échantillon sera gros de 2 octets (16bps/8 ou 16 >> 3), le cadre de l'échantillon prendra également le numéro des canaux en compte, il sera donc de 4 octets gros (2 octets x 2 canaux).

IMPORTANT La théorie derrière cela ne s'applique pas seulement à l'iPhone, mais au codage audio en général! Il arrive que les AudioQueues vous demandent des spécifications bien définies sur votre flux audio, et c'est bien, mais on pourrait vous demander des octets, exprimer les tailles de données audio comme des cadres audio est toujours bon, vous pouvez toujours convertir vos tailles de données et soyez sûr à ce sujet.