2011-11-25 19 views
9

Ho un file che ho bisogno di convertire in formato MPEG-TS in modo che si adatti alle specifiche di seguito:MPEG-TS Encoding

elementare flusso bitrate [kbit/s] il video: 2575 audio: 2 x 192 sottotitolo: - PAT/PMT: - ripieno: -

Componente TS bitrate [kbit/s] il video: 2652 audio: 395 sottotitolo: 45 PAT/PMT: 45 ripieno: 62 totale : 3200 CBR

Ulteriori componenti necessari: PAT PMT pacchetti nulli

componenti che potrebbero pop-up: NIT, SDT, EIT, ecc

vcodec="h264" 
acodec="mpga" 
bitrate="2500" 
arate="192" 
samplerate=48000 
ext="mpg" 
mux="ts" 
vlc="/usr/bin/vlc" 
fmt="mpg" 
dst="/home/adam/test/" 

for a in *$fmt; do 
$vlc -I dummy -vvv "/home/adam/test/" --sout "#transcode{vcodec=$vcodec,venc=x264{profile=main,level=3.0,hrd=cbr,bframes=2},vb=$bitrate,acodec=$acodec,ab=$arate,samplerate=$samplerate,channels=2}:standard{mux=$mux,dst=\"$dst$a.$ext\",ac$ 
done 

dopo la codifica con lo script di cui sopra tutto sembra be ok (per codec bitrate sia video che audio è costante) a parte due cose: anche il bitrate del container dovrebbe rimanere CBR, ma non è così. Inoltre, manca il componente di riempimento (0x1 ffff). È possibile correggere lo script per rendere nullo il pacchetto e il bitrate della costante del contenitore (3,2 Mbps CBR)?

La seconda opzione è la codifica con ffmpeg:

ffmpeg -i video_input.mpg -i audio_input.mp2 -acodec copy -tune zerolatency -x264opts bitrate=2600:vbv-maxrate=2600:vbv-bufsize=166:nal_hrd=cbr -vpre libx264-iptv -vcodec libx264 -f mpegts -muxrate 3200K -y output.ts 

ma come disinserire/disattivare/rimuovere tabella SDT?

risposta

4

Dato che si è a conoscenza del concetto di pacchetti NULL, si potrebbe aver lavorato con software o hardware di livello commerciale in quest'area.

C'è una differenza tra CBR (del video) e la frequenza del sistema (o la frequenza del multiplexer). Quando il video è codificato come CBR, diciamo a 3.2 Mbps, è abbastanza normale che fluttui intorno a quel margine di alcune centinaia di kbps. Quindi il bitrate di punta, potrebbe dire 3,3 Mbps. Questo è abbastanza ok. Aggiungendo un altro 100 kbps di audio, il bitrate massimo totale può essere 3,4. Di solito, in questo caso si imposta la velocità di sistema superiore a 3,6 Mbps o più; dove equilibrio sono pacchetti NULL.

La velocità di sistema 3,5 Mbps NON PUO fluttuare del tutto. Se lo fa, la sincronizzazione basata sulla PCR non funzionerà e, fondamentalmente, le cose non funzioneranno in ambiente live. Quindi, in sostanza, si può pensare a 3,5 Mbps (circa 240 pacchetti in 100 millisecondi) come un BUS. ogni posto deve essere riempito per garantire che il trasporto sia continuo. Di solito, è fatto in modo tale che pochi posti rimarranno vuoti.

La parte triste è che né VLC né altri strumenti in open source lo faranno per voi.

L'hack che abbiamo usato per usare era, che abbiamo utilizzato per inviare ad esempio VLC prodotta flusso over IP (dove l'invio di TS flusso senza pacchetti nulli è ok - e ricevere che tramite l'uscita da un Muxer con ASI o tale interfaccia, che avrebbe aggiunto muxer

In alternativa è possibile utilizzare Manzanita muxer per convertire il flusso TS non Null in flusso TS corretto.

EDIT:
Sulla base del commento - se tutto quello che dovete fare è quello di disabilitare SDT - ci sono due cose che deve essere fatto.

  1. Rimuovere tutti i pacchetti dal PID che corrisponde alla tabella SDT. Se non si è completamente demuxing e re-muxing, un modo rapido per farlo potrebbe essere di ristampare il numero PID a 13 bit con un numero PID del pacchetto NULL.

  2. Rimuovere il riferimento del valore PID SDT nella tabella PAT. Ciò significa essenzialmente che si producono da 3 a 4 pacchetti che sono corretti PAT; e sostituire tutte le sequenze di pacchetti PAT nello stream con questi pacchetti corretti.

+1

Il secondo comando funziona correttamente ma come posso rimuovere la tabella SDT dal file? – adismsc