2016-01-21 146 views
6

出場後我試圖挽救從iPhone攝像頭的視頻文件與下面的代碼:沒有音頻保存視頻與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 
    } 
} 

... 
} 

,到目前爲止,這是工作,但是當我回放用AVPlayer視頻沒有聲音播放。如果我使用Quiktime嘗試視頻,那麼相同的問題,沒有聲音。但是當我用VLC打開它時,聲音播放。

供參考,這是我如何播放視頻,運行但沒有聲音:

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

我檢查與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 

我不知道什麼是錯的, 你能幫助我嗎?

謝謝

+1

我確實將文件的NSURL從video.mp4更改爲video.mov,並且聲音現在可以正常工作。如果你能解釋我爲什麼,它將仍然受到讚賞:) – jrmgx

+0

我無法在AVPlayer,AvPlayerItem或AVAsset的文檔中找到,也許AVPlayer無法播放mp4的 – MikeG

+0

此信息可能會幫助您http ://www.differencebetweenbetween-mov-and-mp4/ –

回答

4

mp4和mov文件非常相似,但有細微的差異。我認爲VLC只是意識到該文件實際上是一個.mov,然後相應地播放它,但AVPlayer並沒有採用它。

您使用AVCaptureMovieFileOutput保存視頻和文檔指出:

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

了一些研究成什麼QuickTime影片是揭示了其標準的文件擴展名是.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.

如果將文件另存爲.mov,則不應再有問題。

+0

你有什麼想法/具體實現的例子一個mp4 FileOutput? – jrmgx

+0

'AVCaptureVideoDataOutput''' - 將視頻保存到mp4的示例可以在這裏找到:http://www.gdcl.co.uk/2013/02/20/iPhone-Pause.html – Casey