Как я могу добавить к записанному файлу MPEG4 AAC?

Я записываю звук на iPhone, используя AVAudioRecorder со следующими настройками:

NSMutableDictionary *recordSettings = [[NSDictionary alloc] initWithObjectsAndKeys:
       [NSNumber numberWithInt: kAudioFormatMPEG4AAC], AVFormatIDKey,
       [NSNumber numberWithFloat:44100.0], AVSampleRateKey,
       [NSNumber numberWithInt:1], AVNumberOfChannelsKey,
       [NSNumber numberWithInt:12800], AVEncoderBitRateKey,
       [NSNumber numberWithInt:16], AVLinearPCMBitDepthKey,
       [NSNumber numberWithInt: AVAudioQualityHigh],  AVEncoderAudioQualityKey,
       nil];

(я могу быть гибким на большинстве этих настроек, но я должен использовать MPEG4 AAC.)

Я сохраняю звук в файл.

Пользователь должен иметь возможность вернуться позже и продолжить запись в тот же файл. Нет Кажется, это вариант сделать это напрямую с помощью AVAudioRecorder , поэтому вместо этого я записываю в новый файл и объединяю их.

В настоящий момент я добавляю файлы, используя AVMutableComposition и AVMutableCompositionTrack как здесь , но он очень медленный для более длинных записей, поэтому это практически невозможно.

Я думаю, что было бы намного быстрее, если бы Я мог бы вырезать заголовок из второго файла, добавить аудиоданные в первый файл, а затем изменить заголовок объединенного файла, чтобы отразить новую продолжительность. Поскольку я знаю, что оба файла были созданы с одинаковыми настройками, я полагаю, что остальные детали в заголовках должны быть идентичными.

К сожалению, я не могу найти никакой информации о том, в каком формате находятся заголовки, и есть ли это ' m писать приложение для Windows Phone 7, которое использует push-уведомления и имеет класс, отвечающий за управление взаимодействиями между серверами уведомлений MS и моей службой в облаке. Однако, когда я пытаюсь открыть канал на моем устройстве, HttpNotificationChannel выдает исключение InvalidOperationException с сообщением «Не удалось открыть канал». Согласно MSDN я должен попытаться открыть канал еще раз.

Мой фрагмент кода для открытия push-уведомления следует стандартному шаблону:

public class HttpNotification {
  private const string kChannelName = "MyApp.PushNotification";

  private HttpNotificationChannel _Channel;

  public void Register() {
    try {
      _Channel = HttpNotificationChannel.Find(kChannelName);
      if (_Channel == null) {
        _Channel = new HttpNotificationChannel(kChannelName);
        InstallEventHandlers();

        // This line throws
        _Channel.Open();
      } else {
        InstallEventHandlers();
      };
    } catch (InvalidOperationException ex) {
      MessageBox.Show(string.Format("Failed to initialise Push Notifications - {0}", ex.Message));
    };
  }
}

Я не совсем понимаю, что MSDN имеет в виду, говоря «попробуйте снова открыть канал». Я заключил вызов Open () в try / catch и отложил 5 секунд между попытками, но это не удалось. Я также пробовал тот же подход ко всему методу (т.е. Выполнять ли вызов HttpNotificationChannel.Find () каждый раз, когда он бросает) безрезультатно.

Я знаю, что это немного расплывчато, но мне было интересно, есть ли у кого-нибудь предложения по решению этой проблемы? Этот же код безупречно работает в эмуляторе, но каждый раз дает сбой на моем реальном устройстве, даже после деинсталляции и повторной установки моего приложения. Учитывая, что это мой настоящий телефон, я немного не хочу делать аппаратный сброс в надежде, что это решит эту проблему, и мне неудобно выпускать приложение на рынок, поскольку эта проблема меня преследует.

Обновить : Дополнительный момент, я использую неаутентифицированный канал, поэтому для моей облачной службы не установлен сертификат.

Обновление №2: Кроме того, я только что попытался развернуть рецепт Microsoft Phone Push Recipe на свое устройство, и он также бросает то же исключение.

6
задан Eran 21 March 2013 в 20:58
поделиться