Tạo video MP4 sẵn sàng cho phát trực tuyến HTTP


25

Làm cách nào tôi có thể chuyển đổi some.flvhoặc some.avihoặc some.wmvvới FFmpeg để chắc chắn rằng video này sẽ có thể phát và tìm kiếm được trong JW Player?

Câu trả lời:


9

Đây là câu trả lời cho nhận xét cuối cùng của bạn @abrahab.

Bạn không cần phải mp4boxcó tệp để có thể phát trực tuyến tệp qua nginx. Mô-đun truyền phát MP4 chăm sóc nó bất kể định vị các nguyên tử moov ( mp4boxchuyển nguyên tử moov sang đầu tập tin).


Bây giờ đối với lỗi máy chủ 500, bạn có đang sử dụng tùy chọn "-frag" với mp4box không? Mô-đun truyền phát MP4 không thể đọc các tệp MP4 bị phân mảnh. Sử dụng tốt mp4boxcho phát trực tuyến giả là xen kẽ các video để tìm kiếm tốt hơn. Dịch chuyển nguyên tử Moov là một lợi thế bổ sung.

Tôi luôn làm điều này với mp4boxmột tệp được mã hóa FFmpeg

MP4Box -add MyVideo.mp4 -isma Myvideo-box.mp4

Điều này cũng sẽ xen kẽ tệp MP4 trong 500 mili giây theo mặc định.


1
Để thực hiện xen kẽ tệp "tại chỗ" mà không phải tạo tệp mới, hãy sử dụng trực tiếpMP4Box -isma -inter 500 Myvideo.mp4
Vineet

45

H.264 trong MP4

Nói chung, bạn muốn tạo video x264 trong một thùng chứa MP4. Tùy chọn này được hỗ trợ bởi về cơ bản bất kỳ thiết bị và trình duyệt.

Sau đây là đủ. Đảm bảo thay thế tên đầu vào và các tùy chọn CRF. Cái sau đặt chất lượng, trong đó các giá trị lành mạnh nằm trong khoảng từ 19 đến 25 - thấp hơn có nghĩa là chất lượng tốt hơn, nhưng tốc độ bit cũng cao hơn:

ffmpeg -i input.avi -c:v libx264 -crf 23 -c:a aac -movflags faststart output.mp4

Bạn cũng có thể sử dụng Handbrake để mã hóa nếu bạn thích cách GUI.

Sử dụng faststarttùy chọn

Bây giờ, những gì bạn cần làm là chuyển nguyên tử MOOV của MP4 sang đầu. Nguyên tử này (về bản chất, một đơn vị dữ liệu trong bộ chứa MP4) sẽ chứa siêu dữ liệu quan trọng về chính các luồng video / âm thanh. -movflags faststartnên làm chính xác điều đó.

Nếu phiên bản FFmpeg của bạn không có tùy chọn này, hãy xem xét nâng cấp. Nếu bạn không thể nâng cấp, bạn có thể đạt được điều tương tự với bất kỳ công cụ nào dưới đây:

  • QTIndexSwapper , một ứng dụng Adobe AIR

  • MP4Box , mã nguồn mở và miễn phí, đang chạy một lệnh tương tự như sau, nơi bạn có thể thay đổi khoảng thời gian (ở đây, 500):

    mp4box -inter 500 input.mp4

  • qt-faststart trong Python , hoạt động ở mọi nơi cài đặt Python.

    qtfaststart input.mp4

Đó là về nó.

Kiểm soát bitrate / chất lượng

Bây giờ, tất nhiên, để phát trực tuyến, bạn thực sự có thể muốn hạn chế bitrate để ở trong giới hạn nhất định. Bạn có thể đọc thêm về điều đó trong bài viết trên blog của tôi về các phương pháp kiểm soát tỷ lệ .

Ví dụ: bằng cách thêm -maxrate 2M -bufsize 2Mvào các tùy chọn mã hóa, bạn giới hạn mã hóa thành 2 Mbit / s, có thể đủ cho video 720p. Tất nhiên, tốc độ bit cần thiết sẽ phụ thuộc vào mức độ phức tạp của nội dung. Điều này có một số thử nghiệm và lỗi.


cảm ơn, tôi làm theo cách tương tự, nhưng dường như vấn đề vẫn xảy ra với video :( Tôi làm ffmpeg -i 1.flv -vcodec libx264 -f mp4 -an -g 1 -f mp4 -g 30 -level 3 new.mp4 rồi mp4boxvà mp4 không thể tìm kiếm và báo cáo nginx 500 internal server errorcho tham số khởi động hơn 0. khi video được mã hóa mà không cần -vcoded libx264(coder mp4 mặc định) tất cả các tập tin làm việc (nhưng chất lượng! bệnh!) :( (xin lỗi, bây giờ, không được phép nâng cao câu trả lời của bạn)
abrahab

Đây có vẻ như là sự cố plugin h.264 với NginX chứ không phải là bất kỳ vấn đề chuyển đổi video nào. Tôi không phải là chuyên gia về video trên web phát trực tuyến , nhưng tôi thấy bạn đã hỏi về điều này trên Stack Overflow? stackoverflow.com/questions/11079748/
Mạnh

Tôi cũng nghĩ rằng có lẽ nginx không thể đọc định dạng video này đúng cách. video từ youtube cũng được phát tốt. vâng, tôi được hỏi về vấn đề nginx, nhưng dường như không có câu trả lời. :(
abrahab

3
+1 cho -movflags faststartchính xác những gì tôi cần
andrew

liên kết đã chết, cần sử dụng web.archive.org: web.archive.org/web/20140201142344/http://www.longtailvideo.com/ Lỗi
malat 24/2/2015

5

Bạn chỉ có thể chuyển đổi AVI hoặc MP4 không thể phát trực tuyến mà không cần mã hóa lại mọi thứ bằng cách thực hiện việc này:

ffmpeg -i INPUT.mp4 -c copy -movflags faststart STREAMABLE_OUTPUT.mp4

Không cần phải mã hóa lại bất cứ thứ gì, vì chỉ cần nguyên tử moov phải được di chuyển.


-1

Bạn có thể thử điều này với ffmpeg:

ffmpeg.exe -i "INPUT_FILE.AVI" -threads 2 -s 800x600 -r 25.00 -threads 1 -pix_fmt yuv420p -g 300 -qmin 3 -b 2048k -async 1 -acodec pcm_s16le -ar 22050 -ac 1 -ab 128k -y "OUTPUT_FILE.mp4"

5
Âm thanh nổi PCM 22 kHz cho video phát trực tuyến trên internet? Nghe có vẻ không hiệu quả lắm. Và tại sao bạn lại thiết lập bitrate âm thanh thành 128k?
slhck

@slhck, bạn có thể đổi 22k thành 44k thay thế "-ar 22050" bằng "ar 44100"
Searush

1
@SEARAS Vấn đề không phải là tỷ lệ lấy mẫu. Đó là thực tế rằng âm thanh là âm thanh nổi PCM không nén. Đối với truyền phát internet. Đó không phải là con số.
slhck

Câu trả lời này có chất lượng rất thấp và cần được loại bỏ. Các tham số có thể thay đổi tốc độ khung hình, độ phân giải video và tốc độ lấy mẫu âm thanh của nội dung và tạo ra kết quả chất lượng thấp hoặc không hiệu quả (ffmpeg có thể chọn chính thông số an toàn hơn hoặc tốt hơn). Hiệu suất cũng bị tê liệt do giới hạn số lượng luồng ít hơn và thậm chí không hoạt động với -acodec pcm_s16le(lỗi Could not write header for output file #0 (incorrect codec parameters ?): Invalid argument:). Một lý do chính đáng như dự thảo IETF tại sao để chọn chính xác các tham số này dường như cũng bị thiếu.
LiveWireBT
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.