Opus 音訊消失

我在使用一個自訂設定檔,把電影預告片重新編碼成 h265 的 mkv 時遇到問題。不知為何,只要原始檔案是 mp4 且音軌為 Opus,轉檔後音軌就會消失。我實在搞不懂……已經試過在 handbrake 與 ffmpeg 之間切換,結果都一樣。

如果我直接到命令列手動拼出 ffmpeg 指令,Opus 音軌就能正常保留。我懷疑只是自己漏看了什麼低級錯誤,需要另一雙眼睛幫忙。

自訂設定檔如下:

[HEVC MKV Trailers]
Description=HEVC CRF 26 in MKV (H.265/AC3) conversion.
order=ffmpeg,handbrake
ffmpeg-general=-threads 0
ffmpeg-video=-ss 0 -max_muxing_queue_size 4000 -vf yadif=0:-1:1,hqdn3d -vcodec libx265 -preset medium -crf 26 -map 0:v -sn
ffmpeg-audio=-acodec copy -map 0:a
ffmpeg-ext=.mkv
ffmpeg-audiodelay=skip
handbrake-general=–decomb --loose-anamorphic --verbose=2
handbrake-video=–start-at duration:0 -e x265 --encoder-preset medium -q 26
handbrake-audio=-E copy -a 1,2,3,4,5
handbrake-ext=.mkv
handbrake-audiodelay=skip
PreConversionCommercialRemover=false

用這些參數組出來的命令列長這樣:

ffmpeg -threads 0 -i “Aquaman (2018)-trailer.mp4” -ss 0 -max_muxing_queue_size 4000 -vf yadif=0:-1:1,hqdn3d -vcodec libx265 -preset medium -crf 26 -map 0:v -sn -acodec copy -map 0:a “Aquaman (2018)-trailer.mkv”

如果我直接執行這行指令,音軌就會保留……是我太蠢漏了什麼簡單的東西嗎?

这很奇怪。ffmpeg 和 handbrake 的音频参数都是 copy。除非在初始 remuxing 过程中出了什么问题。

我从未处理过 opus 音频,所以也没有特别的检查点。

你能附上转换失败时的日志文件吗?我们或许能给你一些排查建议。


看起来处理后视频的 mediainfo 显示根本没有音频流。
Aquaman (2018)-trailer.mp4-Trailers-2021-01-05T12-01-56.log (744.1 KB)

我查看了日誌。在交給 HandBrake 進行轉換之前,它都還能辨識音軌,但就在那一步之後似乎就消失了。不確定原因,但它就是認為沒有音軌。

2021-01-05T12:02:46 MCEBuddy.Transcode.ConvertWithHandbrake → Audio Track : 0
2021-01-05T12:02:50 MCEBuddy.AppWrapper.Handbrake → Warning: Could not find audio track 1, skipped
2021-01-05T12:02:50 MCEBuddy.AppWrapper.Handbrake → Warning: Could not find audio track 2, skipped
2021-01-05T12:02:50 MCEBuddy.AppWrapper.Handbrake → Warning: Could not find audio track 3, skipped
2021-01-05T12:02:50 MCEBuddy.AppWrapper.Handbrake → Warning: Could not find audio track 4, skipped
2021-01-05T12:02:50 MCEBuddy.AppWrapper.Handbrake → Warning: Could not find audio track 5, skipped
2021-01-05T12:02:50 MCEBuddy.AppWrapper.Handbrake → Dropping excess audio encoders

你有 ffmpeg 進行轉換的日誌嗎?我想看看它是如何處理的。

使用 ffmpeg 后看起来有音频流……但仍然没有声音

Aquaman (2018)-trailer.mp4-Trailers-2021-01-05T14-38-13.log (475.9 KB)

我对命令行视频转码完全没经验,但这问题似乎很奇怪……肯定是我哪里打错了?

可以提供原始檔案的 MediaInfo 嗎?

以下是原始文件与转换后音频的 mediainfo JSON。

原始文件
{
@type”: “Audio”,
“StreamOrder”: “1”,
“ID”: “2”,
“Format”: “Opus”,
“CodecID”: “Opus”,
“Duration”: “145.161”,
“Duration_FirstFrame”: “0.001”,
“BitRate_Mode”: “VBR”,
“BitRate”: “120335”,
“FrameCount”: “7258”,
“Compression_Mode”: “Lossy”,
“StreamSize”: “2183488”,
“StreamSize_Proportion”: “0.04322”,
“Language”: “en”,
“Default”: “Yes”,
“AlternateGroup”: “1”
}

使用 ffmpeg 转换后
{
@type”: “Audio”,
“StreamOrder”: “1”,
“ID”: “2”,
“UniqueID”: “2”,
“Format”: “Opus”,
“CodecID”: “A_OPUS”,
“Duration”: “145.161000000”,
“Channels”: “2”,
“ChannelPositions”: “Front: L R”,
“ChannelLayout”: “L R”,
“SamplingRate”: “48000”,
“SamplingCount”: “6967728”,
“BitDepth”: “32”,
“Compression_Mode”: “Lossy”,
“Delay”: “0.000”,
“Delay_Source”: “Container”,
“Language”: “en”,
“Default”: “Yes”,
“Forced”: “No”
}

真奇怪,我搞不懂。
轉換過程中有多個步驟。它會先使用以下命令將原始檔案重新封裝到暫存資料夾:

ffmpeg.exe -hide_banner -probesize 100M -analyzeduration 300M -y -i “F:\Test\Aquaman (2018)-trailer.mp4” -ss 0 -vcodec copy -acodec copy -map 0:a -map 0:0 -f mpegts “f:\temp\working0\Aquaman (2018)-trailer.ts”

然後它會執行其他操作,並使用以下命令開始產生最終檔案:

ffmpeg.exe -hide_banner -probesize 100M -analyzeduration 300M -threads 0 -y -i “f:\temp\working0\Aquaman (2018)-trailer.ts” -ss 0 -max_muxing_queue_size 4000 -vf hqdn3d -vcodec libx265 -preset medium -crf 26 -map 0:1 -sn -acodec copy -map 0:a “f:\temp\working0\Aquaman (2018)-trailer-converted.mkv”

執行第一個命令,看看音訊是否正常。如果不正常,我們需要找出原因。如果正常,執行第二個命令,看看 f:\temp\working0\Aquaman (2018)-trailer-converted.mkv 檔案的結果如何。

第一個指令執行成功,並生成了帶有音訊的 ts 檔案。以下是該檔案的 json。

{
"@type": "Audio",
"StreamOrder": "0-0",
"ID": "256",
"MenuID": "1",
"Format": "Opus",
"CodecID": "6",
"Compression_Mode": "Lossy",
"Language": "en",
"extra": {
"descriptor_tag_extension": "128",
"format_identifier": "Opus"
}

執行第二個指令後音訊消失。mediainfo 的 JSON:

{
@type”: “Audio”,
“StreamOrder”: “1”,
“ID”: “2”,
“UniqueID”: “2”,
“Format”: “Opus”,
“CodecID”: “A_OPUS”,
“Duration”: “145.161000000”,
“Channels”: “2”,
“ChannelPositions”: “Front: L R”,
“ChannelLayout”: “L R”,
“SamplingRate”: “48000”,
“SamplingCount”: “6967728”,
“BitDepth”: “32”,
“Compression_Mode”: “Lossy”,
“Delay”: “0.000”,
“Delay_Source”: “Container”,
“Language”: “en”,
“Default”: “Yes”,
“Forced”: “No”
}

需要的話,這是我執行第二個指令時的輸出:

[spoiler-box]C:\Program Files\MCEBuddy2x\ffmpeg>ffmpeg.exe -hide_banner -probesize 100M -analyzeduration 300M -threads 0 -y -i “f:\temp\working0\Aquaman (2018)-trailer.ts” -ss 0 -max_muxing_queue_size 4000 -vf hqdn3d -vcodec libx265 -preset medium -crf 26 -map 0:1 -sn -acodec copy -map 0:a “f:\temp\working0\Aquaman (2018)-trailer-converted.mkv”
[h264 @ 0000024da0e1e440] non-existing PPS 0 referenced
Last message repeated 1 times
[h264 @ 0000024da0e1e440] decode_slice_header error
[h264 @ 0000024da0e1e440] no frame!
[h264 @ 0000024da0e1e440] non-existing PPS 0 referenced
Last message repeated 1 times
[h264 @ 0000024da0e1e440] decode_slice_header error
[h264 @ 0000024da0e1e440] no frame!
[h264 @ 0000024da0e1e440] non-existing PPS 0 referenced
Last message repeated 1 times
[h264 @ 0000024da0e1e440] decode_slice_header error
[h264 @ 0000024da0e1e440] no frame!
[h264 @ 0000024da0e1e440] non-existing PPS 0 referenced
Last message repeated 1 times
[h264 @ 0000024da0e1e440] decode_slice_header error
[h264 @ 0000024da0e1e440] no frame!
Input #0, mpegts, from ‘f:\temp\working0\Aquaman (2018)-trailer.ts’:
Duration: 00:02:25.14, start: 1.400000, bitrate: 2846 kb/s
Program 1
Metadata:
service_name : Service01
service_provider: FFmpeg
Stream #0:00x100: Audio: opus (Opus / 0x7375704F), 48000 Hz, stereo, fltp
Stream #0:1[0x101]: Video: h264 (High) ([27][0][0][0] / 0x001B), yuv420p(tv, bt709, progressive), 1920x1080 [SAR 1:1 DAR 16:9], 23.98 fps, 23.98 tbr, 90k tbn, 47.95 tbc
Stream mapping:
Stream #0:1#0:0 (h264 (native) → hevc (libx265))
Stream #0:0#0:1 (copy)
Press [q] to stop, [?] for help
x265 [info]: HEVC encoder version 3.1+19-c4b098f973e6
x265 [info]: build info [Windows][GCC 9.1.1][64 bit] 8bit+10bit
x265 [info]: using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2
x265 [info]: Main profile, Level-4 (Main tier)
x265 [info]: Thread pool 0 using 12 threads on numa nodes 0
x265 [info]: Thread pool 1 using 12 threads on numa nodes 1
x265 [info]: Slices : 1
x265 [info]: frame threads / pool features : 4 / wpp(17 rows)
x265 [info]: Coding QT: max CU size, min CU size : 64 / 8
x265 [info]: Residual QT: max TU size, max depth : 32 / 1 inter / 1 intra
x265 [info]: ME / range / subpel / merge : hex / 57 / 2 / 3
x265 [info]: Keyframe min / max / scenecut / bias: 23 / 250 / 40 / 5.00
x265 [info]: Lookahead / bframes / badapt : 20 / 4 / 2
x265 [info]: b-pyramid / weightp / weightb : 1 / 1 / 0
x265 [info]: References / ref-limit cu / depth : 3 / off / on
x265 [info]: AQ: mode / str / qg-size / cu-tree : 2 / 1.0 / 32 / 1
x265 [info]: Rate Control / qCompress : CRF-26.0 / 0.60
x265 [info]: tools: rd=3 psy-rd=2.00 early-skip rskip signhide tmvp b-intra
x265 [info]: tools: strong-intra-smoothing lslices=6 deblock sao
Output #0, matroska, to ‘f:\temp\working0\Aquaman (2018)-trailer-converted.mkv’:
Metadata:
encoder : Lavf58.33.100
Stream #0:0: Video: hevc (libx265), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], q=2-31, 23.98 fps, 1k tbn, 23.98 tbc
Metadata:
encoder : Lavc58.59.100 libx265
Side data:
cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: N/A
Stream #0:1(eng): Audio: opus ([255][255][255][255] / 0xFFFFFFFF), 48000 Hz, stereo, fltp
frame= 3383 fps= 11 q=-0.0 Lsize= 31888kB time=00:02:25.14 bitrate=1799.8kbits/s speed=0.465x
video:29677kB audio:2132kB subtitle:0kB other streams:0kB global headers:2kB muxing overhead: 0.248575%
x265 [info]: frame I: 108, Avg QP:25.25 kb/s: 6129.21
x265 [info]: frame P: 1068, Avg QP:27.95 kb/s: 2977.66
x265 [info]: frame B: 2207, Avg QP:31.77 kb/s: 899.07
x265 [info]: Weighted P-Frames: Y:11.0% UV:8.8%
x265 [info]: consecutive B-frames: 28.3% 13.0% 12.1% 35.9% 10.7%

encoded 3383 frames in 312.11s (10.84 fps), 1722.24 kb/s, Avg QP:30.36[/spoiler-box]