Я пытаюсь удлинить первый кадр видео и закодировать его в Ogg Theora, используя ffmpeg и ffmpeg2theora. Вот сценарий, который у меня сейчас работает, большую часть времени:

//Extract first frame, make short video clip
ffmpeg.exe -i video.mov -c:v copy -c:a pcm_s16le firstFrame.png    
ffmpeg.exe -f lavfi -i aevalsrc=0 -loop 1 -i firstFrame.png -c:v libx264 -preset veryslow -pix_fmt yuv420p -t 00:00:00.500 -c:a pcm_s16le halfSecondFreeze.mov    

//For concatenation to work, I need the same audio format in both videos
//or else ffmpeg2theora will fail
ffmpeg.exe -i video.mov -c:v copy -c:a pcm_s16le fixedAudioVideo.mov    
ffmpeg.exe -i halfSecondFreeze,mov -i fixedAudioVideo.mov -filter_complex \"[0:0] [0:1] [1:0] [1:1] concat=n=2:v=1:a=1:unsafe=1 [v] [a]\" -map \"[v]\" -map \"[a]\" -c:v libx264 -preset veryslow -c:a pcm_s16le frameLengthenedVideo.mov

//Encode to theora in ogv container    
ffmpeg2theora.exe frameLengthenedVideo.mov -c 1 -x 800 -y 600 -o finalVid.ogv

Проблема в том, что иногда это отсекает последний бит некоторых видео. Я обнаружил, что если я использую qtrle качестве кодека при создании короткого клипа и когда я объединяю два видео, финальное видео обрывается раньше. Вместо этого он дает очень изменчивое видео.

Я использую ffmpeg2theora для конвертации в ogv, потому что, похоже, это единственный инструмент, который производит видео, которое нравится моему приложению воспроизведения (Unity3d). Непосредственное использование ffmpeg приводит к странным проблемам с воспроизведением, например, к абсолютно чёрному видео.

Я ищу какие-либо предложения о том, как я мог бы избежать проблемы отсечения или улучшить этот процесс. Если вам нужны какие-либо подробности об одном из видео, которое выходит из строя, я могу вставить соответствующий вывод из MediaInfo здесь.

1 ответ1

2

Попробуйте скопировать аудио на собственный вход с тем же контейнером, что и исходный входной файл.

Возможное решение. Скопируйте аудио в отдельный файл. Создайте свой PNG. Смешайте их вместе. Затем согласитесь с оригиналом.

ffmpeg -i *.mov -c copy -map 0:a audio.mov
ffmpeg -i video.mov -c:v copy -frames:v 1 firstFrame.png 
ffmpeg -loop 1 -i firstFrame.png -i audio.mov -t 0.5 -map 0:v:0 -c:a copy -map 1:a:0 png.mov

Для конкатата я бы использовал этот ответ от переполнения стека.

Я оставил некоторые вещи, но основная идея есть. Вы можете пропустить перемещение звука в отдельный файл, но я хотел подчеркнуть этот шаг. Старайтесь избегать транскодирования, если вам не нужно, копия - ваш друг.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .