Câu trả lời:
Đâ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 mp4box
có 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 ( mp4box
chuyể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 mp4box
cho 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 mp4box
mộ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.
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.
faststart
tùy chọnBâ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 faststart
nê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ó.
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 2M
và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.
ffmpeg -i 1.flv -vcodec libx264 -f mp4 -an -g 1 -f mp4 -g 30 -level 3 new.mp4
rồi mp4box
và mp4 không thể tìm kiếm và báo cáo nginx 500 internal server error
cho 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)
-movflags faststart
chính xác những gì tôi cần
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.
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"
-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.
MP4Box -isma -inter 500 Myvideo.mp4