由于项目需要,自己编码了视频合并的JAVA代码
把视频20170815-114600-114659-00-N-0-1.264.flv
和视频1.flv合并后,生成temp6666.flv
package com.gy.controller.test;
import com.gy.controller.Tags;
import org.aspectj.util.FileUtil;
import org.junit.Test;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class TwoFlv2One {
/***
* 合并FLV视频
*/
@Test
public void gets(){
try {
together("E:\\other\\media\\tother\\t\\20170815-114600-114659-00-N-0-1.264.flv",
"E:\\other\\media\\tother\\t\\1.flv",
"E:\\other\\media\\tother\\temp6666.flv");
} catch (IOException e) {
e.printStackTrace();
}
}
/***
* 执行合并
* @param src1
* @param src2
* @param tar
* @throws IOException
*/
public static void together(String src1,String src2,String tar) throws IOException{
File f1 = new File(src1);
File f2 = new File(src2);
File f3 = new File(tar);
byte[] len1 = FileUtil.readAsByteArray(f1);
byte[] len2 = FileUtil.readAsByteArray(f2);
int lasttime = getTotalTime(len1);//获取第一个视频的所有时间
System.out.println("lasttime:" + lasttime);
addtimes(len2,lasttime);//第二个文件要添加时间撮
//找到len2 15,16,17==第一个tag长度
byte b14 = len2[14];
byte b15 = len2[15];
byte b16 = len2[16];
double xx = CodeTools.to10(CodeTools.bytes2HexStringxxx(b14))*256*256+CodeTools.to10(CodeTools.bytes2HexStringxxx(b15))*256+CodeTools.to10(CodeTools.bytes2HexStringxxx(b16));
System.out.println(xx);
/* change(len1, len2, "width");//以第二个为准,进行变更
change(len1, len2, "height");
change(len1, len2, "framerate");
change(len1, len2, "videodatarate");
change(len1, len2, "videocodecid");*/
// change(len1, len2, "encoder");
add(len1, len2, "duration");//时间相加
add(len1,len2,"filesize");//文件大小相加
//直接改
//len1[4]=5;//音频
int dev = 13+(int)xx+11+4;
// int dev = 13;
int tlen = len1.length + len2.length;
byte[] len3 = new byte[tlen-dev];
for(int i=0; i<len1.length;i++){
len3[i] = len1[i];
}
for(int i=dev; i<len2.length;i++){
len3[i-dev+len1.length] = len2[i];
}
CodeTools.toFile(f3, len3);
}
public static Object[][] deal(byte[] bsource){
//总组数
byte b40=bsource[40];
byte b41 = bsource[41];
double gx = CodeTools.to10(CodeTools.bytes2HexStringxxx(b40))*256+CodeTools.to10(CodeTools.bytes2HexStringxxx(b41));
int nt =42;
Object[][] rs = new Object[(int)gx+1][];
for(int j =0;j<gx;j++){
Object[] obj = new Object[4];
double dx = CodeTools.to10(CodeTools.bytes2HexStringxxx(bsource[nt]))*256+CodeTools.to10(CodeTools.bytes2HexStringxxx(bsource[nt + 1]));
nt = nt+2;
byte[] ts = new byte[(int)dx];
int k = 0;
for(int i=0;i<dx;i++){
ts[k++] = bsource[nt+i];
}
nt =nt+k;
String property = CodeTools.toStr(ts);
System.out.println(property);
obj[0] = property;
String value = null;
if(property.equals("encoder")){
obj[2]=nt;
byte[] tf = new byte[16];
int kf = 0;
for(int i=0;i<16;i++){
tf[kf++] = bsource[nt+i];
}
value = CodeTools.toStr(tf);
System.out.println(value);
System.out.println("nt:" + nt);
nt=nt+16;
obj[3]=nt;
}else{
nt = nt+1;
obj[2]=nt;
//值
byte[] tf = new byte[8];
int kf = 0;
for(int i=0;i<8;i++){
tf[kf++] = bsource[nt+i];
}
nt = nt+8;
Double v = CodeTools.bytes2Double(CodeTools.reverse(tf));
System.out.println(v);
value=v+"";
System.out.println("nt:" + nt);
obj[3]=nt;
}
obj[1] = value;
rs[j] = obj;
}
rs[(int)gx]=new Object[]{"site","",0,nt};
return rs;
}
@Test
public void aaa(){
System.out.println(CodeTools.to10("B8"));
byte b = -72;
String aa = CodeTools.bytes2HexStringxxx(b);
System.out.println(aa);
}
private static Object[] getObj(byte[] res,String property){
Object[][] params = deal(res);
if(params!=null&¶ms.length>0){
for(int i=0;i<params.length;i++){
System.out.println("属性:"+params[i][0]+" 值:"+params[i][1]+" 始:"+params[i][2]+" 末:"+params[i][3]);
//修改属性
if(property.equals((String) params[i][0])){
return params[i];
}
}
}
return null;
}
private static void add(byte[] desc,byte[] sorece,String property){
Object[] descObj = getObj(desc, property);
Object[] sourceObj = getObj(sorece,property);
addRes(desc,descObj,sourceObj,property);
}
private static void addRes(byte[] res,Object[] descObj,Object[] sourceObj,String changeProperty){
if(!(descObj!=null&&descObj.length>0&&sourceObj!=null&&sourceObj.length>0)){
return;
}
for(int i=0;i<sourceObj.length;i++){
String property = (String)sourceObj[0];
String value = (String)sourceObj[1];
if(property.equals(changeProperty)){
for(int j = 0;j<descObj.length;j++){
String property1 = (String)descObj[0];
int st1 = Integer.valueOf(descObj[2]+"");
int et1 = Integer.valueOf(descObj[3]+"");
double value1 = Double.valueOf(descObj[1] + "");
if(property.equals(property1)){
byte[] bw = CodeTools.reverse(CodeTools.double2Bytes(Double.valueOf(value).intValue()+value1));
int k = 0;
for(int f = st1;f<et1;f++){
res[f]=bw[k++];
}
}
}
}else{
continue;
}
}
}
private static byte[] change(byte[] desc,byte[] source,String property){
Object[] descObj = getObj(desc,property);
Object[] sourceObj = getObj(source,property);
return updateRes(desc,descObj,sourceObj,property);
}
private static byte[] updateRes(byte[] desc,Object[] descObj,Object[] sourceObj,String changeProperty){
if(!(descObj!=null&&descObj.length>0)){
}
if(descObj!=null&&sourceObj!=null)
for(int i=0;i<sourceObj.length;i++){
boolean fs = false;
String property = (String)sourceObj[0];
String value = (String)sourceObj[1];
if(property.equals(changeProperty)){
for(int j = 0;j<descObj.length;j++){
String property1 = (String)descObj[0];
int st1 = Integer.valueOf(descObj[2]+"");
int et1 = Integer.valueOf(descObj[3]+"");
if(property.equals(property1)){
byte[] bw = CodeTools.reverse(CodeTools.double2Bytes(Double.valueOf(value)));
int k = 0;
for(int f = st1;f<et1;f++){
desc[f]=bw[k++];
}
fs = true;
}
}
}else{
continue;
}
}
return desc;
}
private static Object[] getObj(Object[] sourceObj,String changeProperty){
for(int i=0;i<sourceObj.length;i++) {
String property = (String) sourceObj[0];
if (property.equals(changeProperty)) {
return sourceObj;
}
}
return null;
}
/**获取文件所有时间*/
public static int getTotalTime(byte[] bytes){
if(bytes!=null){
byte[] bw = new byte[4];
int k = 0;
int len = bytes.length;
byte b0 = bytes[len-4];
byte b1 = bytes[len-3];
byte b2 = bytes[len-2];
byte b3 = bytes[len-1];
int rs = CodeTools.bytesToInt2(new byte[]{b0,b1,b2,b3},0);
System.out.println("rs:"+rs);
int s = bytes.length-4-rs+5-1;
int e = bytes.length-4-rs+8-1;
byte k0 = bytes[s];
byte k1 = bytes[s+1];
byte k2 = bytes[s+2];
byte k3 = bytes[s+3];
int result = CodeTools.bytesToInt2(new byte[]{k3,k0,k1,k2},0);
System.out.println("lasttime:"+result);
return result;
}
return 0;
}
/***
* 时间相加
* @param bytes
* @param times
*/
public static void addtimes(byte[] bytes,int times){
List<Tags> list = getAllTag(bytes);
if(list!=null&&list.size()>0){
int i = 0;
for(Tags tag :list){
if(i++>0){
int s =tag.getS()+5;
s=s-1;
byte k0 = bytes[s];
byte k1 = bytes[s+1];
byte k2 = bytes[s+2];
byte k3 = bytes[s+3];
int result = CodeTools.bytesToInt2(new byte[]{k3, k0, k1, k2}, 0);
int newtimes = result +times;
System.out.println("时间==="+newtimes/1000);
byte[] rb = CodeTools.intToBytes2(newtimes);
bytes[s]=rb[1];
bytes[s+1]=rb[2];
bytes[s+2]=rb[3];
bytes[s+3]=rb[0];
}
}
}
}
/***
* 获取所有tag
* @param bytes
* @return
*/
public static List<Tags> getAllTag(byte[] bytes){//获取所有tag标签
List<Tags> list = new ArrayList<>();
int s = 13;
int e = 0;
while (e<=bytes.length-10){
Tags tag = setTags(bytes, s);
list.add(tag);
e = tag.getE();
s = e;
}
return list;
}
/***
* 设置值
* @param bytes
* @param s
* @return
*/
private static Tags setTags(byte[] bytes,int s){
Tags tags = new Tags();
byte k0 = bytes[s+1];
byte k1 = bytes[s+2];
byte k2 = bytes[s+3];
int result = CodeTools.bytesToInt2(new byte[]{0,k0,k1,k2},0);
int presize = result+11;
tags.setPresize(presize);
tags.setS(s);
tags.setE(s+presize+4);
byte[] b11 = new byte[11];
int k = 0;
for(int i=0;i<11;i++){
b11[k++]=bytes[s+i];
}
tags.setTag11(b11);
return tags;
}
}
package com.gy.controller;
import lombok.Data;
/**
* Created by Administrator on 2017/8/18 0018.
*/
@Data
public class Tags {
private byte[] tag11;
private int presize;
private int s;
private int e;
}
//转换工具网上抄了下,大同小异。
package com.gy.controller.test;
import org.junit.Test;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
public class CodeTools {
public static int to10(String b){
int ii = Integer.parseInt(b,16);
return ii;
}
public static String bytes2HexStringxxx(byte bx) {
String ret = "";
String hex = Integer.toHexString(bx & 0xFF);
if (hex.length() == 1) {
hex = '0' + hex;
}
ret += hex.toUpperCase();
return ret;
}
public static byte[] double2Bytes(double d) {
long value = Double.doubleToRawLongBits(d);
byte[] byteRet = new byte[8];
for (int i = 0; i < 8; i++) {
byteRet[i] = (byte) ((value >> 8 * i) & 0xff);
}
return byteRet;
}
public static double bytes2Double(byte[] arr) {
long value = 0;
for (int i = 0; i < 8; i++) {
value |= ((long) (arr[i] & 0xff)) << (8 * i);
}
return Double.longBitsToDouble(value);
}
public static byte[] reverse(byte[] b){
byte[] r = new byte[b.length];
int k = 0;
for(int i=b.length-1;i>=0;i--){
r[k++]=b[i];
}
return r;
}
public static String toStr(byte[] b){
return new String(b);
}
public static File toFile(File file, byte[] b){
try{
BufferedOutputStream bos = null;
FileOutputStream fos = null;
fos = new FileOutputStream(file);
bos = new BufferedOutputStream(fos);
bos.write(b);
}catch (Exception e){
}
return file;
}
public static byte[] toByte(String s){
return s.getBytes();
}
public static int bytesToInt2(byte[] src, int offset) {
int value;
value = (int) ( ((src[offset] & 0xFF)<<24)
|((src[offset+1] & 0xFF)<<16)
|((src[offset+2] & 0xFF)<<8)
|(src[offset+3] & 0xFF));
return value;
}
public static byte[] intToBytes2(int value)
{
byte[] src = new byte[4];
src[0] = (byte) ((value>>24) & 0xFF);
src[1] = (byte) ((value>>16)& 0xFF);
src[2] = (byte) ((value>>8)&0xFF);
src[3] = (byte) (value & 0xFF);
return src;
}
@Test
public void aaa(){
int ii = bytesToInt2(hexStringToByteArray("00002800"), 0);
System.out.println("ii:"+ii);
}
public static byte[] hexStringToByteArray(String s) {
int len = s.length();
byte[] b = new byte[len / 2];
for (int i = 0; i < len; i += 2) {
b[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4) + Character
.digit(s.charAt(i + 1), 16));
}
return b;
}
}