ffmpeg:拆分mp3,编码aac并连接生成工件和空白空间

时间:2016-06-18 17:22:57

标签: join filter ffmpeg cut artifacts

源mp3

    ffprobe -show_frames -select_streams a -print_format csv -show_entries  
 frame=index,pkt_dts_time ~/demo_files/000.orig.5352357791787324393.mp3
frame,0.000000
frame,0.026122
frame,0.052245
frame,0.078367

我使用命令创建的每个部分,-ss position和-t time我从之前的ffprobe输出中得到并计算

    /home/xxx/bin/ffmpeg -analyzeduration 50000000 -probesize 50000000  
-ss 0.000000 -i /home/xxx/demo_files/000.orig.5352357791787324393.mp3  
-s 0 -t 0.926276 -flags +global_header -c:a libfdk_aac -strict -2  
-b:a 64k -ac 2 -ar 44100 -vn -f mpegts -y /tmp/p0.ts

    /home/xxx/bin/ffmpeg -analyzeduration 50000000 -probesize 50000000  
-ss 1.018776 -i /home/xxx/demo_files/000.orig.5352357791787324393.mp 
-s 0 -t 0.900153 -flags +global_header -c:a libfdk_aac -strict -2  
-b:a 64k -ac 2 -ar 44100 -vn -f mpegts -y /tmp/p1.ts

它的产生

[mp3 @ 0x39ca980] Estimating duration from bitrate, this may be inaccurate
    Input #0, mp3, from '/home/xxx/demo_files/000.orig.5352357791787324393.mp3':
    Duration: 00:05:17.20, start: 0.000000, bitrate: 320 kb/s
    Stream #0:0: Audio: mp3, 44100 Hz, stereo, s16p, 320 kb/s
    [mpegts @ 0x39ccea0] Using AVStream.codec to pass codec  
parameters to muxers is deprecated, use AVStream.codecpar instead.
    [mpegts @ 0x39ccea0] frame size not set
    Output #0, mpegts, to '/tmp/p0.ts':
      Metadata:
        encoder         : Lavf57.38.100
        Stream #0:0: Audio: aac (libfdk_aac), 44100 Hz, stereo, s16, 64 kb/s
        Metadata:
          encoder         : Lavc57.46.100 libfdk_aac
    Stream mapping:
      Stream #0:0 -> #0:0 (mp3 (native) -> aac (libfdk_aac))
    Press [q] to stop, [?] for help
    size=      10kB time=00:00:00.92 bitrate=  92.3kbits/s speed=39.8x    
    video:0kB audio:8kB subtitle:0kB other streams:0kB global  
headers:0kB muxing overhead: 24.619143%
      Duration: 00:00:00.63, start: 1.400000, bitrate: 127 kb/s

零件信息

    ffmpeg -hide_banner -i /tmp/p0.ts 2>&1 |grep -P 'Duration|Stream'
    Duration: 00:00:00.95, start: 1.400000, bitrate: 90 kb/s
    Stream #0:0[0x100]: Audio: aac (LC) ([15][0][0][0] / 0x000F),  
44100 Hz, stereo, fltp, 68 kb/s

然后我和

一起加入所有部分
    /home/xxx/bin/ffmpeg -i /tmp/p0.ts -i /tmp/p1.ts -i /tmp/p2.ts  
-i /tmp/p3.ts -i /tmp/p4.ts -i /tmp/p5.ts -filter_complex  
"[0:a]asetpts=PTS-STARTPTS[a0];[1:a]asetpts=PTS-STARTPTS[a1];  
[2:a]asetpts=PTS-STARTPTS[a2];[3:a]asetpts=PTS-STARTPTS[a3];  
[4:a]asetpts=PTS-STARTPTS[a4];[5:a]asetpts=PTS-STARTPTS[a5];  
[a0][a1][a2][a3][a4][a5] concat=n=6:v=0:a=1 [a]"  
-map [a] -strict experimental -fflags +genpts -flags +global_header  
-c libfdk_aac -bsf:a aac_adtstoasc -y /tmp/res.m4a

原始波形并在左侧连接 i68.tinypic.com/magcnl.jpg

所以,你可以看到加入有延迟和波形后来开始。为什么?也许它认为所有编码部分的起始时间都是1.400000,??如何在编码时将开始时间设置为0?

此外,我尝试在与filter_complex连接时剪切空白区域,但结果stil不好并且包含瑕疵,因为修剪位置在每个部分看起来都不同。

    /home/xxx/bin/ffmpeg -i /tmp/p0.ts -i /tmp/p1.ts -i /tmp/p2.ts  
-i /tmp/p3.ts -i /tmp/p4.ts -i /tmp/p5.ts -filter_complex  
"[0:a]atrim=0.020000,asetpts=PTS-STARTPTS[a0];  
[1:a]atrim=0.020000,asetpts=PTS-STARTPTS[a1];  
[2:a]atrim=0.020000,asetpts=PTS-STARTPTS[a2];  
[3:a]atrim=0.020000,asetpts=PTS-STARTPTS[a3];  
[4:a]atrim=0.020000,asetpts=PTS-STARTPTS[a4];  
[5:a]atrim=0.020000,asetpts=PTS-STARTPTS[a5];  
[a0][a1][a2][a3][a4][a5] concat=n=6:v=0:a=1 [a]"  
-map [a] -strict experimental -fflags +genpts  
-flags +global_header -c libfdk_aac -bsf:a aac_adtstoasc  
-y /tmp/res.m4a

Whyyyy以及如何解决它?

0 个答案:

没有答案