![파일 크기를 유지하기 위한 FFMPEG의 최적 매개변수](https://rvso.com/image/1400009/%ED%8C%8C%EC%9D%BC%20%ED%81%AC%EA%B8%B0%EB%A5%BC%20%EC%9C%A0%EC%A7%80%ED%95%98%EA%B8%B0%20%EC%9C%84%ED%95%9C%20FFMPEG%EC%9D%98%20%EC%B5%9C%EC%A0%81%20%EB%A7%A4%EA%B0%9C%EB%B3%80%EC%88%98.png)
따라서 아이디어는 다음과 같습니다. 1테라바이트 드라이브에 있는 모든.single.video를 내 Chromecast에서 재생할 수 있는 형식으로 변환하고 싶습니다(https://developers.google.com/cast/docs/media) 그리고 나는 그렇게 하기 위해 며칠(몇 주?) 동안 새 PC가 작동하도록 남겨두는 것을 기쁘게 생각합니다. 좋아, FFMPEG를 통해 구원을 얻었습니다.
약간의 배경 지식: 저는 Android/Java 개발자(StackOverflow에서 매우 활동적임)이고 어느 시점에서는 배치 스크립트나 빠른 Java 명령줄을 코딩해야 한다는 것을 알고 있습니다(Java에 더 익숙하기 때문입니다). ) 작업을 수행하려고 시도했지만 FFMPEG 명령줄에서 어떤 인수를 사용해야 할지 잘 모르겠습니다.
따라서 필요한 것은 다음과 같습니다. - 비디오 코덱: H.264 High Profile Level 5 - 오디오 코덱: HE-AAC, LC-AAC, MP3 중 하나(솔직히 차이점은 모르겠습니다. AAC가 더 나을 수도 있겠죠? ) 동일하게 유지 - 확실히 느리거나 느린 속도(더 나은 품질을 위해)를 사용하고 싶습니다. - 확실히 가변 비트 전송률의 2패스를 사용하고 싶습니다(더 나은 품질을 위해)
위의 모든 내용은 튜토리얼과 매뉴얼에서 달성 방법을 보았지만 이제 달성 방법을 잘 모르는 부분은 다음과 같습니다.
최종 파일 크기를 원본과 거의 동일하게 만들고 싶습니다. 그 이유는 드라이브가 대략 80% 정도 꽉 찼기 때문이며 단순히 내용을 변환하는 것만으로는 채우고 싶지 않기 때문입니다. 스크립트에서 파일을 다시 인코딩하고 원본을 삭제하면 문제 없이 계속 움직일 수 있습니다.
그렇다면 스크립트에 넣기 위해 파일 크기에서 video_bitrate 및 audio_bitrate로 어떻게 이동합니까?
추신: 누군가가 동일한 작업을 수행하는 방법을 알고 있다면 핸드 브레이크를 사용하는 것도 똑같이 기쁩니다.
도움에 미리 감사드립니다.
답변1
필요한 ffmpeg 명령은 다음과 같습니다.
ffmpeg -i input.foo -c:v libx264 -profile:v high -level 5 -preset slow -b:v $videobitrate -an -pass 1 output.bar;
ffmpeg -y -i input.foo -c:v libx264 -profile:v high -level 5 -preset slow -b:v $videobitrate -b:a $audiobitrate -pass 2 output.bar
libx264는 h264 인코더이며 모든 옵션이 ffmpeg에서 전달되므로 꽤 자명합니다. 첫 번째 패스에는 오디오가 필요하지 않으므로 -an이 필요합니다. 원한다면 출력을 /dev/null로 파이프할 수 있지만, 뭐든 간에. 두 번째 단계에서는 -y 스위치를 사용하여 묻지 않고 임시 파일을 덮어씁니다. 기본적으로 오디오 코덱은 aac이므로 지정할 필요가 없습니다.
ffprobe$videobitrate 및 $audiobitrate의 값을 얻는 데 도움이 될 수 있습니다(posix 환경을 가정하고 있으며 그렇지 않으면 %videobitrate% 및 %audiobitrate%가 됩니다). 사용할 수 있는 형식으로 값을 가져오려면 sed, awk 또는 perl voodoo를 수행해야 합니다. 내 컴퓨터의 임의 mp4에 대한 ffprobe의 출력은 다음과 같습니다.
ffprobe version 2.1.3 Copyright (c) 2007-2013 the FFmpeg developers
built on Feb 12 2014 22:10:38 with Apple LLVM version 5.0 (clang-500.2.79) (based on LLVM 3.3svn)
configuration: --prefix=/usr/local/Cellar/ffmpeg/2.1.3 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-nonfree --enable-hardcoded-tables --enable-avresample --enable-vda --cc=clang --host-cflags= --host-ldflags= --enable-libx264 --enable-libfaac --enable-libmp3lame --enable-libxvid --enable-libfreetype --enable-libtheora --enable-libvorbis --enable-libvpx --enable-librtmp --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libvo-aacenc --enable-libass --enable-ffplay --enable-libspeex --enable-libschroedinger --enable-libfdk-aac --enable-openssl --enable-libopus --enable-frei0r --enable-libcaca --enable-libopenjpeg --extra-cflags='-I/usr/local/Cellar/openjpeg/1.5.1/include/openjpeg-1.5 '
libavutil 52. 48.101 / 52. 48.101
libavcodec 55. 39.101 / 55. 39.101
libavformat 55. 19.104 / 55. 19.104
libavdevice 55. 5.100 / 55. 5.100
libavfilter 3. 90.100 / 3. 90.100
libavresample 1. 1. 0 / 1. 1. 0
libswscale 2. 5.101 / 2. 5.101
libswresample 0. 17.104 / 0. 17.104
libpostproc 52. 3.100 / 52. 3.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'loop.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf55.19.104
Duration: 00:00:19.56, start: 0.000000, bitrate: 201 kb/s
Stream #0:0(eng): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 400x226 [SAR 226:225 DAR 16:9], 129 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 tbc (default)
Metadata:
handler_name : VideoHandler
Stream #0:1(und): Audio: aac (mp4a / 0x6134706D), 44100 Hz, mono, fltp, 75 kb/s (default)
Metadata:
handler_name : SoundHandler
귀찮게도 ffprobe는 모든 것을 stderr에 덤프하므로 stdout으로 리디렉션해야 합니다. 나는 당신에게 계란을 빠는 방법을 말하지 않을 것입니다. 당신의 sed-fu가 나보다 나을 수도 있지만늦게 오신 분들, 위의 예에서 전체 shebang에 대한 비트 전송률을 얻으려면 다음과 같이 할 수 있습니다.
videobitrate=$(ffprobe input.foo 2>&1|grep bitrate |sed "s/.*bitrate: \([0-9]*\) \([km]*\).*/\1\2/")
그리고 오디오의 경우:
audiobitrate=$(ffprobe input.foo 2>&1|grep Audio|sed "s/.* \([0-9]*\) \([km]*\)b\/s.*/\1\2/")
오디오의 비트 전송률은 지정되고 비디오의 비트 전송률은 지정되지 않은 이유를 잘 모르겠습니다. 일반적으로 일정한 속도 요소(일정한 비트 전송률이 아닌 일정한 품질)로 압축하기 때문일 수 있습니다. 영화에서 ffprobe 출력을 확인해야 합니다. 거기에서 이를 필요한 변수로 바꾸는 것은 여러분에게 달려 있습니다. ffmpeg는 100k 또는 3m과 같은 숫자를 구문 분석합니다.