Cách thay đổi tốc độ khung hình của video mà không cần mã hóa lại


14

Tôi đang cố gắng thay đổi tốc độ khung hình của video MP4 (đó là video GoPro 120 khung hình / giây, tôi muốn phát lại ở tốc độ 30 khung hình / giây để có hiệu ứng chuyển động chậm).

Tôi đang sử dụng avconv cho việc này:

avconv -i SourceMovie.mp4 -vf setpts=4.0*PTS -r 30 DestMovie.mp4

Đó là kỹ thuật hoạt động, nhưng nó khởi động lại bộ phim. Ngoài việc chậm, rõ ràng đây là một vấn đề chất lượng. Về mặt kỹ thuật nên có một cách để chỉ đặt khung hình / giây trong tiêu đề của video, làm cách nào để thay đổi điều đó? (Bất kỳ công cụ nào khác ngoài avconv cũng sẽ hoạt động.)

Câu trả lời:


15

MP4Box có thể làm điều đó.

Lệnh

MP4Box -add SourceMovie.mp4#video -raw 1 -new test

tạo các tập tin testtest_track1.h264. Bây giờ bạn có thể tạo một tệp mp4 với bất kỳ khung hình nào được hỗ trợ mà bạn muốn (30 trong ví dụ này):

MP4Box -add test_track1.h264:fps=30 -new DestMovie.mp4

MP4Box là một phần của gpacgói, vì vậy hãy chắc chắn rằng nó đã được cài đặt.


6
Điều đó thực sự không đơn giản, nhưng tôi hiểu rồi - bạn cần thực hiện theo hai bước. Đầu tiên, trích xuất luồng video riêng biệt dưới dạng raw ( MP4Box -add source.mp4#video -raw 1 -new test) và sau đó lưu lại dưới dạng MP4 một lần nữa ( MP4Box -add test_track1.h264:fps=30 -new dest.mp4). Bạn có thể thêm một đoạn âm thanh ở đó (thông qua #audio).
EboMike

Nó là tốt hơn để sử dụng -singletùy chọn cho lệnh đầu tiên. MP4Box -single 1 -raw 1 SourceMovie.mp4chỉ tạo một tệp SourceMovie_track1.h264thay vì hai.
thợ lặn

6

Thay đổi tốc độ khung hình trong tiêu đề của video (thùng chứa) không ảnh hưởng đến chính video (hoặc audiostream). Mã hóa lại là lựa chọn duy nhất.

Truyền hình video có dấu thời gian và trong hầu hết các video, các khung hình phụ thuộc lẫn nhau do nén liên khung. Một số người chơi có thể tăng tốc và làm chậm video nhưng không phải bằng các lệnh nhúng hoặc thứ gì đó. Không người chơi nào có thể thay đổi tốc độ khung hình khi đang bay khi một người chơi yêu cầu làm như vậy. Đoạn video sẽ kết thúc với đặc điểm kỹ thuật (tức là không tuân theo các tiêu chuẩn) và 99,9% người chơi sẽ từ chối tuân thủ. Hoàn toàn không thể làm những gì bạn muốn mà không cần mã hóa lại. Tất nhiên bạn có thể đợi với mã hóa cho đến bước cuối cùng trong chỉnh sửa của bạn.


1
Cảm ơn thom! Câu hỏi ngu ngốc - tại sao? Có phải mỗi khung hình có dấu thời gian bắt buộc người chơi thực thi một tốc độ phát lại nhất định? Tôi muốn các khung hình chính xác giống nhau, tôi chỉ muốn chúng phát lại ở một tỷ lệ khác.
EboMike

2
Xin chào Mike, không có câu hỏi nào của bạn không ngu ngốc, thẳng thắn theo cách bạn nghĩ là khá thông minh. Tôi thích cách suy nghĩ của bạn. Tôi đã thêm thông tin vào câu trả lời của mình vì quá dài để đưa thông tin này vào hộp bình luận.
thom

Cảm ơn! Đó là khá nhiều thông tin. Bây giờ là để mã hóa lại - cách tốt nhất để làm điều đó với thứ gì đó như avconv là gì? Tôi đã sử dụng dòng lệnh ở trên, nhưng điều đó dẫn đến chất lượng khủng khiếp - tôi gần như có thể thấy mọi macroblock.
EboMike

1
Các dấu thời gian trong các luồng video được lưu trữ trong bộ chứa, chứ không phải dòng bit h.264 thô, tôi nghĩ vậy. Miễn là bạn chỉ muốn thay đổi thời gian, nhưng không phải thứ tự, khung hình nào sẽ được hiển thị khi nào, bạn không cần phải chuyển mã, chỉ cần làm lại. (Và nếu bạn làm xcode, với phần cứng nhanh hơn, bạn sẽ sử dụng -preset chậm hơn hoặc rất chậm để có chất lượng hơn ở tốc độ bit SAME, thay vì chỉ ném thêm bit vào vấn đề. Và sử dụng -crf 18 hoặc thứ gì đó, không phải ABR)
Peter Cordes

1
Tôi không thể tìm ra làm thế nào để có được ffmpeg để tạo ra một tốc độ khung hình khác nhau. Có vẻ như mkvmerge / mp4box là cần thiết, trừ khi bạn có thể lấy ffmpeg để xuất ra một luồng bit .264 thô, sau đó sử dụng tùy chọn fps cho trình giải mã h.264 (trong đó có đầy đủ tài liệu, vì dòng bit không có thời gian thông tin, chỉ cần đặt hàng.)
Peter Cordes

3

Trong trường hợp mục đích chính của bạn là phát nó ở chế độ chuyển động chậm và không giữ tệp dưới dạng MP4, bạn có thể sử dụng công cụ GUI MKVmerge để chuyển nó vào thùng chứa Matroska có thể dễ dàng thay đổi tốc độ khung hình. Remuxing tốt hơn nhiều so với mã hóa lại, bởi vì nó chỉ thay đổi siêu dữ liệu chứ không phải chính luồng.

Đầu tiên bạn cài đặt gói

sudo apt-get install mkvtoolnix-gui

Sau đó, bạn khởi động GUI MKVmerge. Bạn sẽ phải đối mặt với một cửa sổ như thế này

mkvmerge gui 1

Chỉ cần nhấn nút thêm và chọn tệp của bạn hoặc thậm chí chỉ cần kéo-n-thả tệp vào khu vực "Nhập tệp". Tại thời điểm này, bạn sẽ có thể chọn luồng video trong video của mình. Bạn cũng có thể xóa các luồng khác, vì dù sao chúng cũng sẽ cản trở bạn.

Sau khi bạn chọn nó, bạn sẽ thấy các tab dưới cùng đang hoạt động:

nhập mô tả hình ảnh ở đây

Thay đổi thành "Định dạng hành động cụ thể"

nhập mô tả hình ảnh ở đây

Bạn có thể thấy rằng có một trường "FPS", nơi bạn có thể nhập giá trị của khung hình mỗi giây. Có vẻ như bạn đang dự định làm mọi thứ chậm lại bốn lần, vì vậy khoảng 7 khung hình mỗi giây sẽ là mục tiêu của bạn. Bạn cũng có thể sử dụng tùy chọn "Kéo dài".

Sau đó, bạn có thể thay đổi tên của tệp đầu ra (nếu bạn muốn) và nhấn "Bắt đầu muxing".

Chương trình sẽ chạy và bạn nên có tập tin của bạn.


2

Tôi cũng muốn giảm tốc độ làm chậm các bộ phim 120 FPS của mình xuống còn 30 FPS. Tôi đã tạo kịch bản bằng cách thay đổi nhịp độ âm thanh và sửa đổi FPS trực tiếp trong thùng chứa MP4. Các công cụ sau đây được yêu cầu:

  1. avconv để chuyển đổi luồng âm thanh
  2. sondstretch để làm chậm nhịp độ âm thanh
  3. gpac để có được MP4Box để thay đổi FPS

Script được sử dụng để chuyển đổi ở đây:

#!/bin/bash
#########################################
# Lossless slow down from 120 to 30 FPS #
#                                       #
# Use:                                  #
#                                       #
#   slow.bash <mp4_file>                #
#                                       #
#                           #-= OSi =-# #
#########################################


# Prepare basic variables
IN_FILE="$1"
NAME=$(echo "${IN_FILE}" | sed 's/\.[^.]*//')


# Clean up before start
rm -f "${NAME}.ac3" "${NAME}.wav" "${NAME}_.wav" "${NAME}" "${NAME}_track1.h264" "${NAME}_slow.mp4"


# Slow down sound
avconv -i "${IN_FILE}" -vn -acodec pcm_s16le "${NAME}_.wav"
soundstretch "${NAME}_.wav" "${NAME}.wav" -tempo=-75
avconv -i "${NAME}.wav" -vn -codec:a ac3_fixed -b:a 448k "${NAME}.ac3"


# Change video frame rate and multiplex with slowed sound
MP4Box -add "${IN_FILE}#video" -raw 1 -new "${NAME}"
MP4Box -add "${NAME}_track1.h264:fps=30" -add "${NAME}.ac3" -new "${NAME}_slow.mp4"


# Clean up when we are done
rm -f "${NAME}.ac3" "${NAME}.wav" "${NAME}_.wav" "${NAME}" "${NAME}_track1.h264"

Kịch bản lệnh này tạo bản sao của MP4 với hậu tố _slow.

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.