VTCompressionSessionCreate适用于iOS 9,但不适用于iOS 8

时间:2016-03-15 07:22:40

标签: ios video-toolbox

这些简单的代码行(在应用程序中没有任何其他内容)在iOS 9(iPhone 6和iPhone 4S)上运行良好,但在iOS 8(iPhone 5和iPod Touch 5G)上运行不正常:

import java.util.*;
import java.io.*;

import com.twitter.bijection.Injection;
import com.twitter.bijection.avro.GenericAvroCodecs;
import kafka.serializer.StringDecoder;
import kafka.serializer.DefaultDecoder;
import scala.Tuple2;

import org.apache.avro.Schema;
import org.apache.avro.generic.GenericRecord;

import kafka.producer.KeyedMessage;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.SparkConf;
import org.apache.spark.streaming.Duration;
import org.apache.spark.streaming.api.java.JavaPairInputDStream;
import org.apache.spark.streaming.api.java.JavaStreamingContext;
import org.apache.spark.api.java.function.*;
import org.apache.spark.streaming.api.java.*;
import org.apache.spark.streaming.kafka.KafkaUtils;
import org.apache.spark.streaming.Durations;

public class myKafkaConsumer{
  /**
  * Main function, entry point to the program.
  * @param args, takes the user-ids as the parameters, which 
  *will be treated as topics
  * in our case.
  */
  private String [] topics;
  private SparkConf sparkConf;
  private JavaStreamingContext jssc;

  public static final String USER_SCHEMA = "{"
           + "\"type\":\"record\","
           + "\"name\":\"myrecord\","
           + "\"fields\":["
           + "  { \"name\":\"str1\", \"type\":\"string\" },"
           + "  { \"name\":\"int1\", \"type\":\"int\" }"
           + "]}";

  public static void main(String [] args){
    if(args.length < 1){
      System.err.println("Usage : myKafkaConsumber <topics/user-id>");
      System.exit(1);
    }
    myKafkaConsumer bKC = new myKafkaConsumer(args);
    bKC.run();
 }

  /**
  * Constructor
  */
  private myKafkaConsumer(String [] topics){
    this.topics = topics;
    sparkConf = new SparkConf();
    sparkConf = sparkConf.setAppName("JavaDirectKafkaFilterMessages");
    jssc = new JavaStreamingContext(sparkConf, Durations.seconds(2));
  }

  /**
  * run function, runs the entire program.
  * @param topics, a string array containing the topics to be read from
  * @return void
  */
  private void run(){
    HashSet<String> topicSet = new HashSet<String>();
     for(String topic : topics){
      topicSet.add(topic);
      System.out.println(topic);
    }
    HashMap<String, String> kafkaParams = new HashMap<String, String>();
    kafkaParams.put("metadata.broker.list", "128.208.244.3:9092");
    kafkaParams.put("auto.offset.reset", "smallest");
    try{
      JavaPairInputDStream<String, byte[]> messages = KafkaUtils.createDirectStream(
        jssc,
        String.class,
        byte[].class,
        StringDecoder.class,
    DefaultDecoder.class,
    kafkaParams,
    topicSet
  );

  JavaDStream<String> avroRows = messages.map(new Function<Tuple2<String, byte[]>, String>(){
    public String call(Tuple2<String, byte[]> tuple2){
        return testFunction(tuple2._2().toString());
    }
  });
  avroRows.print();
  jssc.start();
  jssc.awaitTermination();
}catch(Exception E){
  System.out.println(E.toString());
  E.printStackTrace();
  }
}

private static String testFunction(String str){
  System.out.println("Input String : " + str);
  return "Success";
}
}

我也尝试过使用较低的分辨率,尝试提供部分或全部可选参数,在所有情况下,它都适用于iOS 9,在iOS 8上失败,错误为-12902(kVTParameterErr)。很高兴知道一些参数是错误的,但是哪一个以及为什么它在iOS 9上没有被认为是错误的?

请注意,VTCopyVideoEncoderList确实为我提供了一个列表,其中avc1(H264)编码器在所有情况下都存在。

知道发生了什么事吗?

1 个答案:

答案 0 :(得分:1)

答案有点晚,但我想这可能对其他人有用。对于iOS 8,您应在创建压缩会话时指定VTCompressionOutputCallback outputCallback。来自文档:

@param  outputCallback
    The callback to be called with compressed frames.
    This function may be called asynchronously, on a different thread from the one that calls VTCompressionSessionEncodeFrame.
    Pass NULL if and only if you will be calling VTCompressionSessionEncodeFrameWithOutputHandler for encoding frames.

反过来,VTCompressionSessionEncodeFrameWithOutputHandler仅适用于iOS 9

__OSX_AVAILABLE_STARTING(__MAC_10_11, __IPHONE_9_0)