階層にフォルダ分けされた音楽ファイルをノーマライズして再変換したいのですが、親ディレクトリ丸ごとバッチファイルにD&Dして処理したいです
以下のように記述してみたのですが、No such file or directoryのエラーが出てしまいます
どう改良すれば良いか、どなたかご教示下さい
@echo off
for %%f in (%*) do (
ffmpeg -i "%%~f" -filter:a loudnorm -c:v copy -c:a libfdk_aac -b:a 320k -ar 44100 "%%~dpnf_fixed.m4a"
del "%%~f" )
pause
ファイルをD&Dして望む結果を得られていたら、ffmpegのコマンドは問題なし。
ディレクトリをD&Dしてエラーになるのは、ファイルを検索するためのforが不足してると思う。
>>7
ファイルを直接D&Dだと、複数ファイルでも正常に変換できます
バッチファイルの知識が乏しいので、検索して調べてもこれ以上の改善方法がわかりません
スレ違いかもしれませんが、どなたかよろしくお願いします for /R "%1" %%f in (*.*) do (
とか
>>10
ご丁寧にありがとうございます!
無事に希望通りの動作をさせることができました
本当に感謝です 動画ファイルを -vcodec copy -acodec copy で複製するとき
mp4だとハッシュ値が常に変わらないのに対してwebmだと毎回変わるんですが
この挙動の差はなんでしょうか?
>>12
mkv(webmはmkvのサブセット)は原則として一意なIDが埋め込まれる
さらに、各トラックにも同様に一意なIDが識別に必須なものとして埋め込まれる
だから原則として同じハッシュにはならないよ ffmpegで動画からpng形式で抽出した画像と、
ffmpeg以外(DavinciやMPC-BE[madVR])から抽出した画像で
明るさが若干違うのだけど、原因や対処方法ご存知の人います?
多分transferやガンマ指定の問題だと思うのだけど
テスト動画
ffmpegで抜き出した場合
ffmpeg -i hts-samp001.mp4 -vf trim=start_frame=0:end_frame=1,setpts=PTS-STARTPTS -vframes 1000 "hts-samp001.png"
madVR等で抜き出した場合
DavinciやAviUtlで抜き出してもそうなるからレンダラの問題じゃなさそうです
Davinci・AviUtl・MadVRだと明るさは一緒で
ffmpegだけ少し暗い感じです
もしてかしてRGBとYUVの色範囲の違いじゃね
aviutlとかはYUVソースをPC表示するためにRGB(0-255)に変換していて
ffmpegの場合はそういう処理をせずにYUV(16-235)の色階調そのまま
とか?
俺も以前に連番PNG化したときにそんな感じのことあったな
レンジ合わせれば普通に見える
>>19>>20
-vf scaleのin_rangeでlimitedとfullを変えてpng出力すると
”若干”でなくだいぶ変わるのでそういうことでもなさそうです
(out_rangeは指定しても変化なし) auto_scalerがbt709 Color MatrixでYUV→RGB
そしてlimitedレンジからfullにしたのが
「ffmpegで抜き出した場合」の画像
システムガンマがBT.1886になるようにYUVのYにフィルターがかかってるのが
「madVR等で抜き出した場合」の画像
>>23
ありがとうございます。納得しました
頂いた情報を元に軽く調べてみましたが
ffmpeg側で合わせる方法は見当たらないようですね 出来ると思うんだけど、画像へのリンクが切れてるんだよね。
>>23が正しいかどうかもわからない。
とりあえず、colorspaceフィルタでは無理だと思う。 sRGBディスプレイで閲覧するとしてzscaleでtransferinをbt709、transferをiec61966-2-1にして輝度をフィルタリングすればいい
colorspaceはたしかリニア輝度にするときシーンライトにしてしまうはず。
transferの検索結果にカメラとかテレビとかの専門サイトがたくさんでてくるなあ
職業カメラマンはこんな複雑なことわかってないといけねえのか…大変だ
framerate30の動画を1変更したいんだけど他はそのままの条件で行きたいけど-r 1にしてもできる動画サイズが元のより大きくなってしまう。
どうしたら劣化させずにframerateだけ小さくして、ファイルサイズも小さくできますか?
新しめコーデック HEVC, AV1を使う
-crf を少しずつ上げる、-b:v を直接指定する
デコードせずにはフレームレートを変換できないような動画であると仮定すると、解決策はビットレートを直接指定すること。
強制的にビットレートを下げるには-b:vを使ってね。
>>31,32
ありがとうございます。勉強してきます。 m4aのタグ編集したいんだけどpipe:0としてstdinで渡すとmp4系列は機能しないんだね・・・
ffmpegでtiffファイルからyuvファイルを作りたいのです。
フレームレートを固定したままビットレートのみ、変更したいです。
元の動画のフレームレートが59.94なので以下のコマンドで実行しましたが、うまく行きません。
どうすればよいのでしょうか。
【コマンド】
ffmpeg -video_size 3840x2160 -r 59.94 -i a05_4K00%03d.tiff -vframes 30 -pix_fmt yuv420p -r 59.94 a05.yuv
続けて質問申し訳ありません。A.mp4(1分) B.mp3(2分) を結合させるとき…
ffmpeg -i A.mp4 -i B.mp3 -vcodec copy -acodec copy C.mp4
を実行すると、当然C.mp4(2分)が作成されるわけですが、A.mp4(1分)に合わせたC.mp4(1分)を作成する場合どのようにコマンドをすれば良いですか?
※A.mp4の時間は(30秒-2分)で毎ファイル異なります。
アドバイスよろしくお願いしますm(_ _)m
scale_cudaのinterp_algo=lanczosってなんかバグってる
bicubicの方がいい
MacOS使ってるんだけどlibfdk-aacってビルドした後にバイナリの実行ファイルは生成されない?
ビルドが成功したのかもわからんから不安
とりあえず
libフォルダ内
→libfdk-aac.aとlibfdk-aac.la
includeフォルダ内
→aacdecoder_lib.h等の.hファイルが6つ
生成されるのは確認できた
yt-dlpが早いのはffmpegの-c copyと同じコピー使ってるからかな?
でも、ようつべは開発者ツールのネットワークで検索して出てきた元webm&webaをffmpeg -i url output.mp4したら弾かれたから何かそういう技術あんのかな?
あ、ちなみにちゃんとrange=0-数にしてffmpeg入力しても弾かれたから
bgra (実際は透明部分無し)のrawvideo(24GB)をyuv420p10leのAV1に変換したく、ただHEVCやVP9など他のものも試したいと考えてます
ファイルサイズがかなり大きいのでRGB to YUVだけ終わらせた中間ファイルを残しておきたいのですが、映像コーデックをffv1で残しておけば色空間の変換以外で劣化は起きない認識で良いのでしょうか?
あってるよ
yuv420p10leでrawvideoとffv1間の変換は可逆
フォーマットのこと全然判らんな
あれはどういう必要があって複雑なことになってるんだ
省資源、コンポジット、アライメントの都合だね
フォーマットってのはつまりVRAMに値をどう配置するかって話だけど
得意不得意あるからフォーマットがたくさんある
MSXの画面モードはRGBやYUV(のようなもの),パックドやプレーナー、コンポジット(のようなもの)全部入りで面白いよ
エンコーダの性能をしらべるために動画の中で動きの激しい箇所のみをエンコードしたいのですが、
動画の中で動きが激しい場所を調べられるオプションはありますか?
vmafmotionフィルタか, sitiフィルタのsi
エントロピーフィルタを使うシーンかとおもいや、あれはフレーム間調べないんだ
単純にh.264をhevcへ変換するだけの簡単な仕事、AMD 3020eで試したら散々な目に遭った
GPUでエンコードするとブロックノイズまみれ、CPUでエンコードするとCore i5-4670の1/10程度の速度
Windowsのstatic版の最新安定版で試してみたのだが、gentooインストールバトルして最適化したらCPUエンコード速度が改善する余地あるのだろうか、それとも所詮はZenアーキテクチャの限界でハードウェア的に無理??
その為に買ったGPUだし、GPU以外は選択肢に無いな
hpの14sシリーズ最安値機を2万円台で買ったのを試しただけなので、、、
Core i5-4670機が稼働する限りはCPUエンコード、壊れたら中古で第6世代あたりの廉価デスクトップi5とか第8Core i3とか…
passmarkやcpu-monkey的にはfinal PentiumのG7400でもマルチスレッド性能は4670より上ですね
誰も聞いてないのに貧乏語りするの気持ち悪いな
ガラクタいくつも並べて無駄な時間かける暇あるなら、働いてまともなPC組めば?
12400とかで安くマシなの組めるだろ
いきなり情報量ゼロの罵倒を始める方が闇が深いな
カルシウム足りてるか?
12世代の反りを嫌う人が居るのは理解して居るか?
同じZenならRyzen 7 1000シリーズ中古があるじゃないか
格安ボロ買って散々な目にあっただのとw自己否定したいだけ?
2万円台ノートとほぼ同価格の12400挙げるのはアホ
エンコで時間使う人間が12400程度の金も出さないとか、人生いろいろケチりで損してそうだな
中古買う奴が反り気にするとかどんなブーメランだよ
古いPCで何かすることは否定しないけど
大して参考になる情報でもない、脈絡もなくいきなり自分語りしだす方がおっさん臭くてキツいね
どう見ても3020eでのエンコはネタつくりだべ
Celeron N4000とかでやるのと大差ない
Linux関連の板でもないのに「Gentooインストールバトル」とかキモすぎる
そもそもここffmpeg自体のフィルターやオプション、最近のコーデックが話題であってHEVCとかいまさらなんだわ
ましてやHEVCに世代合わせるかのようにボロPCしか例に出さんし
悪いこといわんからまともなエンコしたきゃ、ここ2年くらいのCPUか1650S以上のグラボ使っとけ
5600Xや11400, 12400あたりの安CPUでもHEVCなら足りる
CPUはここ10年のなら何でもいい
肝心なのはGPU
RocketかAlderのiGPUありなら新しいQSVあるしCPUエンコ狙えなくもないし一石二鳥だな
遅すぎる原因、分かりました
これまでの環境でgit for Windowsのシェルで実行していたのを、同じ感覚でWSLで実行したためでした
興味深い情報の提供、感謝いたします
>>52 sitiフィルタの使い方を調べて動画のスコアを調べようとしたのですが、「そんなフィルターはない!」と怒られてしまいます。
何か追加でインストールが必要なのでしょうか?
それとも、入力したのがyuvファイルだったのがダメだったのでしょうか?
何か、分かる方がいらっしゃいましたら、おしえて頂けると幸いです mp4動画にチャプター情報つけてるんだけど
そのちゃごとにタイムコードを付加するというのは無理なのかな?
>>72
このスレの大半は無視と罵倒とマウンティングで出来ています
x264 / hevc /VP8の話題は原則禁止です
mp4とだけ書くのも禁止です
ffmpeg -i foo.mp4などと実行してVideo部分のcodecを確認してから質問してください >>72
Yes, it is possible to add a timecode to each chapter in an mp4 container.
To do this, you can use the -timecode option in FFmpeg. This option allows you to specify a timecode for each chapter in the mp4 container.
Here is an example command that you can use to add timecodes to each chapter in an mp4 container:
ffmpeg -i input.mp4 -map 0 -c copy -metadata:s:t:0 timecode="00:00:00:00" -timecode_frame_start 0 output.mp4
In this command, the -timecode option is used to specify a timecode for each chapter in the mp4 container. The timecode is specified in the format HH:MM:SS:FF, where HH represents the hours, MM represents the minutes, SS represents the seconds, and FF represents the frames.
In this example, the timecode for each chapter is set to 00:00:00:00, which represents the start of the video. You can adjust this timecode as needed to specify different timecodes for each chapter.
After running this command, the output mp4 container will include timecodes for each chapter, which you can use to navigate the video at specific points in time. ところで、mp4(m4a含む)でチャプターを付ける時
一番お気楽な方法ってなんなんだろう
定番では Drax、
個人的にわかりやすいのは mkvtoolnixでMKV出力→ffmpegでコンテナ変換だと思うけど、
前者はD'nDができないし、後者はVBRフラグが引き継がれない(ffmpegのいわば仕様)
気楽の定義がわからんけど、CUIのツールを組み合わせて
テキストベースでpythonとか使いながらやるのが一番楽な筈
最近のffmpeg(snapshot2022-12-02)って、昔と比べてエンコード速度が速くなっている代わり
にVAAPI(Linuxです)使用時でもCPUを積極的に使用するように仕様が変わったんですか?
昔と言っても(2022-02-02)のsnapshotなんですが、Core i7 7700Kのマシンで、h264_vaapiで地上波m2ts
の変換で、6倍速ぐらいの速度でCPU周波数はIntel P-stateのpowersaveで1.1GHzぐらいで、task managerの使用率も1%ぐらいだったんですが、
2022-12-02版だと13倍速でる代わりに同じくpowersaveで3.2GHzぐらい食って、task managerの使用率も8%ぐらいでした。
何か変更でもアナウンスされてましたっけ?
>>76
要するに、他のメタデータを考えることなく、
チャプタの時間を指定するだけ(チャプタ名は数字順)で済むような方法という想定だったんだけど、
ググってみたら、pythonのヘルパースクリプトがあるみたいだね
pythonは使えるので、参考にして自分で書いちゃったほうが楽なのかな
mpvプレーヤーには、該当箇所でキーを押してmkvチャプタ(mkvmergeで使われるxml形式)を出力するというプラグインがあるんだけど、
同様にffmpeg用(FFMETADATA)ファイルを出力するようなものがあるといいと思った
やはり、映像や音声を確認しながらその場でチャプタを指定できると便利だ 普段は再生にmpc-hcを使ってて、
ctrl-Gが指定時間にジャンプする機能だけど、
その時に現在の時間が表示されてるので、編集するつもりでctrl-A ctrl-Cでコピーしてくると
04:03.891
こんなフォーマットでクリップボードに入る
大抵はこれで足りる
>>79
そのあたりは、mpvのプラグインスクリプトのほうが楽かな
copyTime.luaっていうのがあって、これだと "Ctrl + C" だけで同じhh:mm:ss.fff形式のものが拾える
音声で厳密に出したいときはAudacityで波形を見ながらやることもある >>81
ごめん、いろいろ悪ふざけが過ぎた
ただ、一応俺の目であってるか確認したけど、このレス自体はChatGPTに答えさせたやつなんだ vspipe -c y4m "test7.vpy" - |\
ffmpeg -y -i - -pix_fmt nv12 -c:v h264_amf -quality quality -rc vbr_peak -qmin 20 -qmax 26 -g 120 -maxrate 8M -b:v 2.5M "x264.mkv"
これで使ってる、まあエンコードはしないけどね
-c:v hevc_amf -quality quality -min_qp_i 20 -max_qp_i 28 -min_qp_p 20 -max_qp_p 28 -header_insertion_mode idr -g 120 -rc vbr_peak -bf 1 -vbaq false -maxrate 8M -b:v 1.5M
FFmpegで指定できる伝達特性をまとめていて気がついたのですが。
zscaleフィルターsmpte240mのガンマと逆ガンマ補正の計算式が逆に実装されているのではないでしょうか?
実際にFFmpegを使用して映像にフィルタを適用し、試したわけではありません。
SMPTE_240M_ALPHA = 1.1115
SMPTE_240M_BETA = 0.0228
光(L)、信号(V)とすると、
smpte_240m_oetf(float V)はこんな処理
1. Vが0以下ならV = 0とみなしてL = 0 (終わり)
2. Vが0.0912 (※4xBETA) より小さいなら
L = V ÷ 4 (終わり)
3. Vがそれ以上なら
L = { ( V + 0.1115 ) ÷ 1.1115 } の (1 ÷ 0.45)乗
smpte_240m_inverse_oetf(float L)はこんな処理
1. Lが0以下ならL = 0とみなしてV = 0 (終わり)
2. Lが0.0228より小さいなら
V = L x 4 (終わり)
3. Lがそれ以上なら
V = 1.1115 x ( Lの0.45乗 ) - 0.1115
返信ありがとうございます。私もそのPDFを読んでみました。
>このPDF見ながらソース読んでみたけど、処理自体は正しく書かれてるように思える
>あとはこれを使ってる場所が正しくLとVを使ってるかどうかじゃないかなあ
>Lを使うべきところでVを使ってるとか、その逆とか
はい、そう思います。
同じソースコードの330行目を見ると、OETFの引数にVを、EOTFの引数にLを入力していませんか。
もしそうなら、LとVを逆に扱っていないでしょうか?
>>89は予想です。
func.to_linearやfunc.to_gammaって書いてあるのを見て思っただけで、全体の処理の流れを理解していません。
>>87のプログラムの説明助かりました! >>90
330付近は300から始まるブロックだけど、select_transfer_functionって名前の通りでその処理(リニア化、ガンマ化)をするためにどの計算方法を使うかを選んでいる
リニア化はシーン参照(入力参照)なら上カーブになる240m_inverse、そうじゃない(出力参照)なら下カーブになるRec.1886eotfで正解じゃない?
勘違いしてるかな
いや、出力参照でRec.1886を使ってるのが正しいのかと言われると断言できないけど リニア化は人間の視覚特性に合わせて暗部の圧縮をするので下カーブになると思います。
ただ、どうして出力参照でRec.1886 EOTFを適用するんでしょう。
PDFの記述と食い違いがあります。(今気づきましたが、1991年の記事なんですね)
Rec.1886はCRTの模倣なので、再生時の逆ガンマ補正がもしCRTだけ(パススルー)だったら理にかなっています。
ネットで調べてもよくわからないです。
とりあえずいまは式をMarkdownへ書き起こす作業をしています。
BT470_MとREC_470_BGとLOG_100とLOG_316の式がH.273と違いますね
すみません>>96解決しました。
BT470_MとREC_470_BGは、OETFとinverse OETF、func.to_linearとfunc.to_gammaがそれぞれ逆ですが、結果的に処理は正しく
LOG_100とLOG_316は、式の区間が調整されてますが、計算結果は変わらないようです。 FFmpegのzscaleでST240に変換しようとしましたがエラーが出て処理が進みません
コマンドです。
ffmpeg -y -i testimage.jpg -filter_complex "zscale=rangein=full:primariesin=709:transferin=709:matrixin=470bg:range=full:primaries=709:transfer=7:matrix=470bg" -f image2 -qmin 1 -q 1 -update 1 240m.jpg
7がST240のはずですが…
https://hackmd.io/vaTZN7iBTI-26yxQVd72TQ?view#Rec-ITU-R-BT709-66 smpte240mをFFmpegのzscaleでテストするという目的はまだ達成できていませんが、試行錯誤の結果を報告します。
>>98でFFmpeg5.1を使っていました。
FFmpeg5.1とmasterの間で、FFmpeg/libavfilter/vf_zscale.cが変更されているようです。
コミットメッセージによると、smpte240m transferオプションの追加を含む変更とのことなので、2023年1月4日の最新ビルドで同じコマンドを試してみました。
しかし、>>98と同じ結果、つまりFFmpeg5.1と同じエラーが発生しました。
以下はそのエラーの出力です。 ffmpeg version 2023-01-04-git-4a80db5fc2-full_build-www.gyan.dev Copyright (c) 2000-2023 the FFmpeg developers
built with gcc 12.1.0 (Rev2, Built by MSYS2 project)
(文字数制限のためconfigurationを中略)
libavutil 57. 43.100 / 57. 43.100
libavcodec 59. 56.100 / 59. 56.100
libavformat 59. 34.102 / 59. 34.102
libavdevice 59. 8.101 / 59. 8.101
libavfilter 8. 53.100 / 8. 53.100
libswscale 6. 8.112 / 6. 8.112
libswresample 4. 9.100 / 4. 9.100
libpostproc 56. 7.100 / 56. 7.100
Input #0, image2, from 'testimage.jpg':
Duration: 00:00:00.04, start: 0.000000, bitrate: 21988 kb/s
Stream #0:0: Video: mjpeg (Progressive), yuvj444p(pc, bt470bg/unknown/unknown), 320x240 [SAR 72:72 DAR 4:3], 25 fps, 25 tbr, 25 tbn
Stream mapping:
Stream #0:0 (mjpeg) -> zscale:default
zscale:default -> Stream #0:0 (mjpeg)
Press [q] to stop, [?] for help
Assertion failed: (!path.empty()) && ("empty path"), file ../src/zimg/colorspace/colorspace.cpp, line 33
Assertion failed: (!path.empty()) && ("empty path"), file ../src/zimg/colorspace/colorspace.cpp, line 33
Assertion failed: (!path.empty()) && ("empty path"), file ../src/zimg/colorspace/colorspace.cpp, line 33
zscaleが対応していない伝達特性reserved、bt1361、smpte428とは異なり、FFmpegは数秒間停止した後に終了するような動作をします。
709 1
bt709 1
bt470m 4
bt470bg 5
smpte170m 6
601 6
linear 8
linear 8
log100 9
log316 10
iec61966-2-4 11
iec61966-2-1 13
2020_10 14
bt2020-10 14
bt2020-12 15
2020_12 15
smpte2084 16
arib-std-b67 18
では変換に成功しました。
ソースにチャプターが無い時に、先頭にだけチャプターを付ける、みたいなことはできる?
その後、mkvmergeで結合する時に面倒が無い
ffprobeなどで調べたらいいんじゃね。チャプター
先頭にチャプターひとつって、なんかメリットあるの?
プレーヤーの動作も変わらないような
mkvmergeで各ファイルの先頭にチャプターを付けることもできるけど、
既に付いてるところにさらに付けると壊れるんだよな
だから、動画には全部チャプターが付いているものとして、mkvmergeでは何もしないのが安全
>>114
壊れるんじゃなくて、別のチャプターセットが作られて、そちらが優先されるんじゃなかったっけ? チャプター4つとチャプター2つの動画をチャプター生成付きでマージすると、
チャプター8つの動画になって、チャプター6に飛ぼうとすると次のファイルとかになる