2011-08-17 32 views
5

Tôi đang cố tìm cách tốt nhất để tải lên video từ iPhone (iOS5) nhanh nhất có thể - thời gian thực nếu có thể.Gần Tải lên Video Thời gian Thực từ iPhone

Tôi thấy câu hỏi và câu trả lời trước đây rất hữu ích.
streaming video FROM an iPhone

Nhưng nó đã để lại cho tôi một số câu hỏi chưa được trả lời. Tôi không có đủ đại diện để đăng nhận xét trong câu hỏi đó- và tôi nghĩ rằng các câu hỏi của tôi đang vượt quá phạm vi của câu hỏi ban đầu.

Vì vậy:

  1. Đang sử dụng AVCaptureSession/AVAssetWriter và cắt video thành những clip ngắn cách tốt nhất để nhanh chóng di chuyển video (nén) tắt của iPhone - trong gần thời gian thực?

  2. Nếu có thể ai đó cung cấp thêm chi tiết về cách sử dụng hai AVAssetWriters và hàng đợi nền để tránh bị bỏ học (như người dùng Steve McFarlin đề cập trong câu hỏi được tham chiếu ở trên)? Tôi không rõ cách thức trao đổi từ một AVAssetWriter này sang một thiết bị khác sẽ hoạt động như thế nào ...

  3. (Quan trọng) Có cách dễ dàng để thêm các tệp video đã cắt nhỏ vào video có độ dài đầy đủ hay ít nhất có thể chơi chúng như thể chúng là một video hoàn chỉnh? Tôi sẽ cần phải hợp nhất các tập tin nhỏ hơn để trông giống như một tập tin cả trên máy chủ và trên iPhone (để xem trước).

Nhờ sự giúp đỡ ...

+0

Bạn không thể đặt các câu hỏi này ở nơi công cộng. Khi bạn là một nhà phát triển iOS hấp dẫn để phá vỡ NDA của họ với Apple và b) nếu bạn cũng là nhà phát triển iOS trả phí, hãy phá vỡ NDA của bạn với Apple. Sẽ là khôn ngoan/khôn ngoan để hạn chế các bài phát triển iOS 5 của bạn thành ** diễn đàn ** riêng tư ** và ** bí mật ** của Apple được lưu trữ trên diễn đàn. – twilson

+0

Nếu bạn không phải là nhà phát triển iOS có trả tiền thì bạn không có chỗ nào sử dụng SDK beta 5 iOS và sẽ phải chờ đến khi Apple phát hành iOS 5 đúng cách! – twilson

Trả lời

4

Vâng, bạn có thể thử để làm đệm trên điện thoại nhưng điều đó dường như phản tác dụng đối với tôi, cho rằng nó đã nhớ hạn chế. Tôi sẽ cố gắng thiết lập một AVCaptureSession và sử dụng AVCaptureVideoDataOutput mà sẽ bán các khung cho bạn trên một thread dispatch_queue riêng biệt (nếu thiết lập nó sẽ bán chúng như là khung MPEG). Chủ đề đó có thể đưa các khung hình ra một ổ cắm không đồng bộ để truyền, có thể với một tiêu đề nhỏ cho biết số khung và định dạng video. Cách khác, bạn có thể đưa dữ liệu đến một chuỗi gửi qua hàng đợi để cho phép bạn theo dõi số lượng khung đang chờ truyền đi.

Trên máy chủ nhận, bạn muốn xử lý việc tạo bộ đệm nhỏ (giả sử một vài giây) và làm khung sắp xếp lại nếu chúng sắp hết hàng.

Vấn đề lớn sẽ phát hiện băng thông và biết khi nào nên giảm chất lượng xuống, do đó bạn không kết thúc với việc tồn đọng các gói đang đợi để đi ra ngoài. Đó là một chủ đề hoàn toàn khác và phức tạp :) Phím sẽ nằm trong lựa chọn của bạn nếu codec, chất lượng và kích thước video ... sẽ trực tiếp xác định băng thông cần thiết để truyền các khung hình trong thời gian thực. AVVideoCodecH264 được hỗ trợ trong phần cứng ở các chế độ nhất định và có lẽ là tùy chọn thực tế duy nhất cho mã hóa theo thời gian thực.

Tôi không nghĩ rằng bạn sẽ tìm thấy một ví dụ sẵn sàng cho điều này mặc dù nó thể hiện rất nhiều công việc để làm việc vừa phải.

+0

có api propper nào để đọc dữ liệu phân đoạn phương tiện hay không và truy xuất dấu thời gian, –

0

2) Đây là cách tôi chunked các tập tin mà không thả quá nhiều khung:

- (void) segmentRecording:(NSTimer*)timer { 
    AVAssetWriter *tempAssetWriter = self.assetWriter; 
    AVAssetWriterInput *tempAudioEncoder = self.audioEncoder; 
    AVAssetWriterInput *tempVideoEncoder = self.videoEncoder; 
    self.assetWriter = queuedAssetWriter; 
    self.audioEncoder = queuedAudioEncoder; 
    self.videoEncoder = queuedVideoEncoder; 
    //NSLog(@"Switching encoders"); 

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{ 
     [tempAudioEncoder markAsFinished]; 
     [tempVideoEncoder markAsFinished]; 
     if (tempAssetWriter.status == AVAssetWriterStatusWriting) { 
      if(![tempAssetWriter finishWriting]) { 
       [self showError:[tempAssetWriter error]]; 
      } 
     } 
     if (self.readyToRecordAudio && self.readyToRecordVideo) { 
      NSError *error = nil; 
      self.queuedAssetWriter = [[AVAssetWriter alloc] initWithURL:[self newMovieURL] fileType:(NSString *)kUTTypeMPEG4 error:&error]; 
      if (error) { 
       [self showError:error]; 
      } 
      self.queuedVideoEncoder = [self setupVideoEncoderWithAssetWriter:self.queuedAssetWriter formatDescription:videoFormatDescription bitsPerSecond:videoBPS]; 
      self.queuedAudioEncoder = [self setupAudioEncoderWithAssetWriter:self.queuedAssetWriter formatDescription:audioFormatDescription bitsPerSecond:audioBPS]; 
      //NSLog(@"Encoder switch finished"); 

     } 
    }); 
} 

https://github.com/chrisballinger/FFmpeg-iOS-Encoder/blob/master/AVSegmentingAppleEncoder.m

3) Dưới đây là một kịch bản để nối các tập tin trên máy chủ

import glob 
import os 
run = os.system # convenience alias 


files = glob.glob('*.mp4') 
out_files = [] 

n = 0 
for file in files: 
    out_file = "out-{0}.ts".format(n) 
    out_files.append(out_file) 
    full_command = "ffmpeg -i {0} -f mpegts -vcodec copy -acodec copy -vbsf h264_mp4toannexb {1}".format(file, out_file) 
    run(full_command) 
    n += 1 

out_file_concat = '' 
for out_file in out_files: 
    out_file_concat += ' {0} '.format(out_file) 

cat_command = 'cat {0} > full.ts'.format(out_file_concat) 
print cat_command 
run(cat_command) 
run("ffmpeg -i full.ts -f mp4 -vcodec copy -acodec copy -absf aac_adtstoasc full.mp4") 

https://github.com/chrisballinger/FFmpeg-iOS-Encoder/blob/master/concat-mp4.py

+0

Làm cách nào để truy cập vào các đoạn được phân đoạn này và truyền chúng với nssstream tới máy chủ sau đó đến thiết bị ios khác? – sajwan

+0

Nếu 'assetWriter' kết thúc thành công việc viết, đó là nơi bạn có khả năng có thể thực hiện cuộc gọi đại biểu để tải lên các phân đoạn, và sau đó dừng ghi âm tải lên cuối cùng? Hay tôi đang thiếu một cái gì đó? – HighFlyingFantasy

Các vấn đề liên quan