2016-01-21 10 views
6

próbuję zapisać plik wideo z aparatu iPhone z tego następujący kod:dźwięk nie jest odtwarzany po zapisie wideo z 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 
    } 
} 

... 
} 

i do tej pory to działa, ale kiedy odtwarzanie wideo za pomocą AVPlayer nie słychać dźwięku. Jeśli spróbuję wideo z Quiktime, ten sam problem, brak dźwięku. ALE kiedy otworzę go za pomocą VLC, dźwięk będzie odtwarzany.

Dla porównania jest to w jaki sposób odtworzyć film, który działa, ale bez dźwięku:

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

Obejrzałem film z 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 

nie mam pojęcia co jest nie tak, możesz mi pomóc?

Dziękujemy

+1

Zrobiłem zmienić NSURL pliku z wideo.mp4 na wideo.mov i dźwięk teraz działa. Jeśli mógłbyś mi wytłumaczyć dlaczego, to nadal będzie doceniane :) – jrmgx

+0

Nie mogłem znaleźć w dokumentach dla 'AVPlayer',' AvPlayerItem' lub 'AVAsset', być może AVPlayer nie może odtworzyć mp4's – MikeG

+0

Ta informacja może ci pomóc http : //www.differencebetween.net/technology/difference-between-mov-and-mp4/ –

Odpowiedz

4

Pliki MP4 i MOV są bardzo podobne, ale mają subtelne różnice. Myślę, że VLC po prostu zdaje sobie sprawę, że plik jest w rzeczywistości .mov, a następnie odtwarza go odpowiednio, ale AVPlayer nie zbiera się na nim.

używasz AVCaptureMovieFileOutput aby zapisać film i jego dokumentacji stwierdza:

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

trochę badań na co film QuickTime jest ujawnia, że ​​jego standardowe rozszerzenie pliku jest .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.

jeśli zapiszesz plik jako .mov nie powinno być już problemów.

+0

Czy masz jakiś pomysł/przykład konkretnej implementacji dla plik mp4 FileOutput? – jrmgx

+0

'' 'AVCaptureVideoDataOutput''' - przykład zapisu filmu na MP4 można znaleźć tutaj: http://www.gdcl.co.uk/2013/02/20/iPhone-Pause.html – Casey

Powiązane problemy