Tôi đang sử dụng AVCaptureSession
để quay video và nhận khung thời gian thực từ máy ảnh iPhone nhưng làm cách nào tôi có thể gửi đến máy chủ bằng ghép kênh và âm thanh và cách sử dụng ffmpeg để hoàn thành tác vụ này, nếu có bất kỳ hướng dẫn nào về ffmpeg hoặc bất kỳ ví dụ xin vui lòng chia sẻ ở đây.Làm thế nào để có được dòng video thời gian thực từ máy ảnh iphone và gửi nó đến máy chủ?
Trả lời
Cách tôi đang thực hiện nó là triển khai AVCaptureSession, trong đó có một đại biểu với một cuộc gọi lại chạy trên mọi khung hình. Gọi lại đó sẽ gửi mỗi khung qua mạng đến máy chủ, trong đó có một thiết lập tùy chỉnh để nhận nó.
Đây là dòng chảy:
Và đây là một số mã:
// make input device
NSError *deviceError;
AVCaptureDevice *cameraDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
AVCaptureDeviceInput *inputDevice = [AVCaptureDeviceInput deviceInputWithDevice:cameraDevice error:&deviceError];
// make output device
AVCaptureVideoDataOutput *outputDevice = [[AVCaptureVideoDataOutput alloc] init];
[outputDevice setSampleBufferDelegate:self queue:dispatch_get_main_queue()];
// initialize capture session
AVCaptureSession *captureSession = [[[AVCaptureSession alloc] init] autorelease];
[captureSession addInput:inputDevice];
[captureSession addOutput:outputDevice];
// make preview layer and add so that camera's view is displayed on screen
AVCaptureVideoPreviewLayer *previewLayer = [AVCaptureVideoPreviewLayer layerWithSession:captureSession];
previewLayer.frame = view.bounds;
[view.layer addSublayer:previewLayer];
// go!
[captureSession startRunning];
Sau đó, đại biểu các thiết bị đầu ra của (ở đây, tự) đã thực hiện gọi lại:
-(void) captureOutput:(AVCaptureOutput*)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection*)connection
{
CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
CGSize imageSize = CVImageBufferGetEncodedSize(imageBuffer);
// also in the 'mediaSpecific' dict of the sampleBuffer
NSLog(@"frame captured at %.fx%.f", imageSize.width, imageSize.height);
}
Gửi khung hình thô hoặc hình ảnh riêng lẻ sẽ không bao giờ hoạt động tốt đủ cho bạn (vì số lượng dữ liệu và số lượng khung hình). Bạn cũng không thể phục vụ hợp lý bất cứ thứ gì từ điện thoại (các mạng của WWAN có tất cả các loại tường lửa). Bạn sẽ cần phải mã hóa video và truyền trực tuyến video tới máy chủ, rất có thể trên định dạng phát trực tuyến chuẩn (RTSP, RTMP). Có một chip bộ mã hóa H.264 trên iPhone> = 3GS. Vấn đề là nó không phải là dòng định hướng. Tức là, nó xuất ra siêu dữ liệu cần thiết để phân tích cú pháp video cuối cùng. Điều này khiến bạn có một vài lựa chọn.
1) Nhận dữ liệu thô và sử dụng FFmpeg để mã hóa trên điện thoại (sẽ sử dụng rất nhiều CPU và pin).
2) Viết trình phân tích cú pháp của riêng bạn cho đầu ra H.264/AAC (rất khó).
3) Ghi và xử lý theo khối (sẽ thêm độ trễ bằng độ dài của các đoạn và thả khoảng 1/4 giây video giữa mỗi đoạn khi bạn bắt đầu và dừng các phiên).
, Tính đến đó tôi đã làm, cảm ơn cho phản ứng của bạn, Câu hỏi của tôi là sau đó làm thế nào tôi gửi khung âm thanh và video từ iPhone đến máy chủ. – Ron
Tôi hiểu điều này là cũ, nhưng tôi bị mắc kẹt ở phía máy chủ của chủ đề này rất. Bạn đã định cấu hình máy chủ của mình như thế nào để xử lý luồng hình ảnh? – Siriss
Trang Không tìm thấy bởi developer.apple.com. – AechoLiu
Hãy thử chụp video sử dụng khuôn khổ AV Foundation. Tải nó lên máy chủ của bạn bằng tính năng truyền trực tuyến HTTP.
Ngoài ra kiểm tra một chồng một bài đăng stack overflow dưới đây
(The post below was found at this link here)
Bạn rất có thể đã biết ....
1) How to get compressed frames and audio from iPhone's camera?
Bạn ca n không làm điều này. API AVFoundation đã ngăn chặn điều này từ mọi góc độ. Tôi thậm chí đã cố gắng đặt tên ống, và một số khác lén lút unix foo. Không may mắn như vậy. Bạn không có lựa chọn nào khác ngoài việc viết nó vào hồ sơ. Trong bài đăng được liên kết của bạn, người dùng đề xuất thiết lập gọi lại để phân phối các khung được mã hóa. Theo tôi biết điều này là không thể cho các luồng H.264. Đại biểu chụp sẽ cung cấp hình ảnh được mã hóa theo định dạng pixel cụ thể .Đó là các nhà văn phim và AVAssetWriter làm mã hóa .
2) Encoding uncompressed frames with ffmpeg's API is fast enough for
real-time streaming?
Có nó được. Tuy nhiên, bạn sẽ phải sử dụng libx264 để đưa bạn vào lãnh thổ GPL. Đó không phải là chính xác tương thích với các cửa hàng ứng dụng.
Tôi khuyên bạn nên sử dụng AVFoundation và AVAssetWriter cho các lý do hiệu quả .
Có một câu chuyện dài và ngắn về nó.
Đây là ngắn một: đi xem https://github.com/OpenWatch/H264-RTSP-Server-iOS
đây là một điểm khởi đầu.
bạn có thể tải xuống và xem cách anh ấy trích xuất khung. Đây là một dự án nhỏ và đơn giản.
Sau đó, bạn có thể xem kickflip có chức năng cụ thể là "encodedFrame" được gọi là lực quay lại và khung được mã hóa đến từ điểm này u có thể làm những gì bạn muốn với nó, gửi qua websocket. Có một loạt các mã rất khó có thể đọc được các nguyên tử mpeg
Tôi giả sử bạn đã ghi các tệp tin MOV/MP4 'chunk'. Bạn có thể truyền phát trực tiếp bằng cách sử dụng một dự án cũ mà tôi đã viết [ffstream] (https://github.com/otmakie/LivuLib) (được phân chia bởi ai đó). Hãy nhớ rằng bạn phải duy trì một thời gian tăng đơn điệu. Nói cách khác, thời gian bắt đầu của bạn cho mỗi MOV/MP4 phải giống nhau. Bằng cách này, tất cả các tệp 1 + N sẽ có khoảng trống 'trống' ở đầu và dấu thời gian được tạo bởi mov.c trong ffmpeg sẽ chính xác. Bạn có thể sử dụng RTSP/RTP qua UDP/TCP hoặc sử dụng plugin librtmp cho ffmpeg để phát trực tuyến. –
@SteveMcFarlin Bạn có thể giúp tôi làm thế nào để gửi luồng từ địa phương đến máy chủ, nó có nghĩa là làm thế nào để gửi dòng như một đoạn. – Ron