2016-01-21 1 views
6

je tente d'enregistrer un fichier vidéo de la caméra iPhone avec ce code:Aucun audio est joué après l'enregistrement vidéo avec AVCaptureMovieFileOutput

class Camera { 

... 

private func loadDeviceInput() { 
    let devices = AVCaptureDevice.devices() as! [AVCaptureDevice] 
    for device in devices { 
     if device.hasMediaType(AVMediaTypeVideo) { 
      if device.position == .Back { 
       _deviceBack = device 
       _inputBack = try? AVCaptureDeviceInput(device: device) 
      } 
      else if device.position == .Front { 
       _deviceFront = device 
       _inputFront = try? AVCaptureDeviceInput(device: device) 
      } 
     } 
     else if device.hasMediaType(AVMediaTypeAudio) { 
      _inputAudio = try? AVCaptureDeviceInput(device: device) 
     } 
    } 
} 

private func loadDeviceOutput() { 
    _outputStill = AVCaptureStillImageOutput() 
    _outputStill?.outputSettings = [AVVideoCodecKey: AVVideoCodecJPEG] 
    if _session.canAddOutput(_outputStill) { 
     _session.addOutput(_outputStill) 
    } 

    _outputAudio = AVCaptureAudioDataOutput() 
    if _session.canAddOutput(_outputAudio) { 
     _session.addOutput(_outputAudio) 
    } 

    _outputVideo = AVCaptureMovieFileOutput() 
    _outputVideo?.movieFragmentInterval = CMTimeMake(1, 1) // Save file header every second 

    if _session.canAddOutput(_outputVideo) { 
     _session.addOutput(_outputVideo) 
    } 
} 

func startVideoCapture(writeTo file: NSURL, startedBlock: JrmgxNSURLResultBlock, stopedBlock: JrmgxNSURLResultBlock) { 
    isSessionRunning() 

    prepareForVideoCapture() 
    _startVideoCaptureBlock = startedBlock 
    _stopVideoCaptureBlock = stopedBlock 

    if _outputVideo?.connectionWithMediaType(AVMediaTypeVideo)?.active ?? false == true { 
     _outputVideo?.startRecordingToOutputFileURL(file, recordingDelegate: self) 
    } 
    else { 
     // ERROR 
    } 
} 

... 
} 

et jusqu'à présent, cela fonctionne, mais quand je la lecture de la vidéo à l'aide AVPlayer aucun son n'est joué. Si j'essaie la vidéo avec Quiktime, même problème, pas de son. MAIS quand je l'ouvre avec VLC, le son joue.

Pour référence c'est la façon dont je joue la vidéo, qui fonctionne, mais sans le son:

player = AVPlayer(URL: v) 
player.actionAtItemEnd = .None 
player.muted = false 
player.volume = 1 
player.play() 

J'inspectée la vidéo avec ffprone:

$ ffprobe test4.mp4 
ffprobe version 2.8.1 
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'test4.mp4': 
    Metadata: 
    major_brand  : qt 
    minor_version : 0 
    compatible_brands: qt 
    creation_time : 2016-01-21 13:13:55 
    Duration: 00:00:06.37, start: 0.000000, bitrate: 818 kb/s 
    Stream #0:0(und): Video: h264 (Baseline) (avc1/0x31637661), yuv420p(tv, smpte170m/bt709/bt709), 480x360, 741 kb/s, 30.01 fps, 30 tbr, 600 tbn, 1200 tbc (default) 
    Metadata: 
     rotate   : 90 
     creation_time : 2016-01-21 13:13:55 
     handler_name : Core Media Video 
    Side data: 
     displaymatrix: rotation of -90.00 degrees 
    Stream #0:1(und): Audio: aac (LC) (mp4a/0x6134706D), 44100 Hz, mono, fltp, 62 kb/s (default) 
    Metadata: 
     creation_time : 2016-01-21 13:13:55 
     handler_name : Core Media Audio 

Je ne sais pas ce qui est faux, pourriez-vous m'aider?

Merci

+1

J'ai changé le fichier NSURL du fichier de video.mp4 en video.mov et le son fonctionne maintenant. Si vous pouviez m'expliquer pourquoi, il sera encore apprécié :) – jrmgx

+0

Je ne pouvais pas trouver dans les docs pour 'AVPlayer',' AvPlayerItem' ou 'AVAsset', peut-être que AVPlayer ne peut pas lire – MikeG

+0

mp4 Cette info peut vous aider http : //www.differencebetween.net/technology/difference-between-mov-and-mp4/ –

Répondre

4

fichiers mp4 et mov sont très similaires, mais ont des différences subtiles. Je pense que VLC se rend compte simplement que le fichier est en fait un .mov et le joue en conséquence, mais AVPlayer ne prend pas le dessus.

vous utilisez AVCaptureMovieFileOutput pour enregistrer la vidéo et sa documentation indique:

AVCaptureMovieFileOutput is a concrete sub-class of AVCaptureFileOutput you use to capture data to a QuickTime movie.

un peu de recherche sur ce qu'est un film QuickTime est révèle que son extension de fichier standard est .mov:

Save as QuickTime movie – This option will save the embedded video in a *.mov file format no matter what the original container is/was.

Si vous enregistrez le fichier en tant que .mov, il ne devrait plus y avoir de problème.

+0

Avez-vous une idée/exemple d'une implémentation concrète pour un fichier mp4 FileOutput? – jrmgx

+0

'' 'AVCaptureVideoDataOutput''' - Exemple d'enregistrement d'une vidéo sur mp4 peut être trouvé ici: http://www.gdcl.co.uk/2013/02/20/iPhone-Pause.html – Casey